以字符形式输出而不是汇编形式中的数字

时间:2019-04-12 12:10:25

标签: assembly x86-16 emu8086

我是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

注意:我已经添加了必要的最少代码,如果您需要整个代码,请告诉我。

1 个答案:

答案 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