初次编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。