在程序集中将输出作为字符而不是数字
Getting output as a character instead of a number in assembly
我对 8086 比较陌生。我正在使用程序制作一个 4 函数计算器。
当我输入输入为:
第一number:1
秒number: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
注意:我已经添加了必要的最少代码,如果您需要完整代码,请告诉我。
MOV AH,01H ;get user input part 1
INT 21H
MOV BL,AL ;store 1st number in BL
评论"store 1st number in 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
我对 8086 比较陌生。我正在使用程序制作一个 4 函数计算器。 当我输入输入为:
第一number:1
秒number: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
注意:我已经添加了必要的最少代码,如果您需要完整代码,请告诉我。
MOV AH,01H ;get user input part 1 INT 21H MOV BL,AL ;store 1st number in BL
评论"store 1st number in 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