在程序集中将输出作为字符而不是数字

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