今天汇编语言写了个小小的程序,作用是显示算式25+9=34,开发环境为masm2015+win7 64位
一开始我的代码如下:
.486
DATA SEGMENT
SUM DB ?,?;此处输入数据段代码
MESG DB '25+9='
DB 0,0,'$'
N1 DB 9
N2 DB 25
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
BEG:
MOV AX,DATA
MOV DS,AX
MOV BX,OFFSET SUM ;取SUM的偏移地址
MOV AH,N1
MOV AL,N2
ADD AH,AL
MOV [BX],AH
CALL CHANG
MOV AH,9
MOV DX,OFFSET MESG
INT 21H
MOV AH,4CH
INT 21H
CHANG PROC
LAST:
CMP BYTE PTR [BX],10
JC NEXT
SUB BYTE PTR [BX],10
INC BYTE PTR [BX+7]
JMP LAST
NEXT:
MOV DL,SUM
ADD [BX+8],DL
ADD BYTE PTR [BX+7],30H
ADD BYTE PTR [BX+8],30H
RET
CHANG ENDP
CODE ENDS
END BEG
结果跑的时候老遇到错误instruction operands must be the same size。报错的定位是 如下两句:MOV BX,OFFSET SUM以及MOV DX,OFFSET MESG。我百思不得其解,看了代码半天也没找出问题。上文那种调用语句的话汇编教材上有很多例程都是这样的,应该不至于说有语法错误。后来找了一些能跑的例程,对比全文后,发现我似乎少写了USE16。我试着加上,之后问题居然解决了!看来涉及到mov后跟offset的必须指明USE16。
改进后代码如下:
.486
DATA SEGMENT USE16
SUM DB ?,?;此处输入数据段代码
MESG DB '25+9='
DB 0,0,'$'
N1 DB 9
N2 DB 25
DATA ENDS
CODE SEGMENT USE16
ASSUME CS:CODE,DS:DATA
BEG:
MOV AX,DATA
MOV DS,AX
MOV BX,OFFSET SUM ;取SUM的偏移地址
MOV AH,N1
MOV AL,N2
ADD AH,AL
MOV [BX],AH
CALL CHANG
MOV AH,9
MOV DX,OFFSET MESG
INT 21H
MOV AH,4CH
INT 21H
CHANG PROC
LAST:
CMP BYTE PTR [BX],10
JC NEXT
SUB BYTE PTR [BX],10
INC BYTE PTR [BX+7]
JMP LAST
NEXT:
MOV DL,SUM
ADD [BX+8],DL
ADD BYTE PTR [BX+7],30H
ADD BYTE PTR [BX+8],30H
RET
CHANG ENDP
CODE ENDS
END BEG