我是8086的新手。我正在使用过程制作4功能计算器。 当我输入以下内容时:
第一个数字:1
第二个数字:1
选择:1(1用于加法)
我得到的输出为'b'。 提出我的问题,谁能告诉我为什么会这样,并且我应该进行哪些更改才能使输出为“ 2”?
DATA SEGMENT
MSG1 DB 'Enter a number:$'
MSG2 DB 'Enter another number:$'
MSG3 DB '1 for addition$'
MSG7 DB 'Enter choice(1-4):$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA ;initialize DS
MOV DS,AX
MOV DX,OFFSET MSG1 ;print msg1
MOV AH,09H
INT 21H
MOV AH,01H ;get user input part 1
INT 21H
MOV BL,AL ;store 1st number in BL
PRINTN
MOV DX,OFFSET MSG2 ;print msg2
MOV AH,09H
INT 21H
MOV AH,01H ;get user input part 2
INT 21H
MOV CL,AL ;store 2nd number in CL
PRINTN
MOV DX,OFFSET MSG3 ;print msg3
MOV AH,09H
INT 21H
MOV DX,OFFSET MSG7 ;print msg7
MOV AH,09H
INT 21H
MOV AH,01H ;get user input part 3 (choice for add,sub etc)
INT 21H
MOV DL,AL ;store user's choice in dl
CMP DL,1 ;basically if-else
JE L1
L1:PRINTN
CALL ADDITION ;call addition proc
HLT
ADDITION PROC
ADD BL,CL ;add the numbers and store in bl
MOV DX,OFFSET MSG8 ;print MSG8
MOV AH,09H
INT 21H
MOV DL,BL ;mov sum to dl
MOV AH,02H ;ah=2 for o/p
INT 21H ;interrupt
RET ;go back to main
ADDITION ENDP
注意:我已经添加了必要的最少代码,如果您需要整个代码,请告诉我。
答案 0 :(得分:1)
MOV AH,01H ;get user input part 1 INT 21H MOV BL,AL ;store 1st number in BL
注释“在BL中存储第一个数字” 是这里的罪魁祸首!您从DOS输入功能中得到的是一个字符。最好将字符转换成它代表的数字。只需减去48。
您是否要验证输入确实是“ 0”,“ 1”,“ 2”,...,“ 9”之一?
mov ah, 01h ;get user input part 1
int 21h
sub al, '0' ;'0' is the same as 48 (30h)
mov bl, al ;store 1st number in BL
对第二个数字执行相同操作。
现在,所有计算都可以对真实数起作用。
要显示(单个字符)结果,您需要将数字转换回一个字符。只需添加48。
mov dl, b ;mov sum to dl
add dl, '0' ;'0' is the same as 48 (30h)
mov ah, 02h
int 21h