当前位置: 代码迷 >> 汇编语言 >> 汇编小疑点(32位)
  详细解决方案

汇编小疑点(32位)

热度:5800   发布时间:2013-02-26 00:00:00.0
汇编小问题(32位)
初次编32位的
可是连接报错

"MOV     RESULT[SI],AL;error     A2155:   cannot   use   16-bit   register   with   a   32-bit   address "

第一次编32位的,不明白是怎么回事(16位下类似可以啊)
大侠们在帮忙看看吧
谢谢了!
代码如下:

.386
DATAS   SEGMENT
        X DD 001565A0H
        Y DD               0021B79EH
        Z DD ?
        RESULT DB 10   DUP( '$ ')
DATAS   ENDS

CODES   SEGMENT
        ASSUME   CS:CODES,DS:DATAS
START:
        MOV   AX,DATAS
        MOV   DS,AX
       
        MOV   EAX,X
        MOV EBX,Y
        ADD EAX,EBX
        MOV Z,EAX
       
        MOV   CX,8
        MOV SI,7
        LOOPER: MOV EAX,Z
        AND AL,0FH
        ADD AL,30H
        MOV RESULT[SI],AL
        MOV EAX,Z
        SHR EAX,4
        LOOP LOOPER
       
MOV               EDX,OFFSET   RESULT                 ;
MOV               AH,09H
INT               21H
       
        MOV   AH,4CH
        INT   21H
CODES   ENDS
        END   START

------解决方案--------------------------------------------------------
在 .386 前加上 .model small 语句:

.model small
.386
------解决方案--------------------------------------------------------
为什么要加 .model 语句, 这个是和 Masm 编译选择的缺省的地址模式有关的. 下面是 Masm 帮助中的说明:

If the .MODEL directive is preceded by the .386 or .486 directive
(or their privileged counterparts), the assembler uses 32-bit
segments. If the .386 or .486 directive follows the .MODEL
directive, the default 16-bit segments are used. The flat memory
model uses 32-bit segments and must be preceded by a .386 or .486
directive.

大致意思就是 .386 语句在 .model 语句之前的话, 缺省使用 32 位段模式; .model 在 .386 语句之前, 缺省是使用 16 位模式.
.386 语句之前没用 .model 语句, 那就是使用 32 位模式了, 寻址用的寄存器也需要是 32 位的, 所以这时用 si 就错了.
但, 实际上你的程序的地址模式应该是 16 位的, 所以要在 .386 前加上 .model 语句


至于不能显示结果, 那是由于生成显示字符串的代码上有错误的:
....
MOV EAX,Z ;*
LOOPER:
mov ebx, eax ; ebx 用来保存移位的中间结果
AND AL,0FH
ADD AL,30H
cmp al, '9 ' ;*+ 这几条指令对 'A '- 'F ' 字符进行校正
jbe @f ;*+
add al, 7 ;*+
@@: ;*+
MOV RESULT[SI],AL
MOV EAX,ebx ;* Z
SHR EAX,4
dec si ;*+
LOOP LOOPER

MOV DX,OFFSET RESULT ; 这里 DX 就可以了
....
------解决方案--------------------------------------------------------
@@ 是新版本MASM中引入的特性,省却了以往命名标号不能重复的麻烦。
@F意思是代表最靠近的下面的一个@@标号,@B则相反。
顾名思义,F为front的缩写,而B为behind。
  相关解决方案