Получение вывода в виде символа вместо числа в сборке - PullRequest
2 голосов
/ 12 апреля 2019

Я относительно новичок в 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 Ответ

1 голос
/ 13 апреля 2019
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
...