8086 простое десятичное сложение из пользовательского ввода

#assembly #x86 #x86-16

#сборка #x86 #x86-16

Вопрос:

Я создаю программу сборки 8086, чтобы попросить пользователя ввести десятичное значение, добавить к нему 5 и затем распечатать. но он выполняет вычисления с использованием шестнадцатеричных значений.

Поэтому, когда я, например, ввожу 5: это будет 0x35 0x35 = 0x6A, тогда Ox6a будет распечатан как ‘j’ в соответствии с таблицами ASCII

В настоящее время я использую это прерывание для пользовательского ввода.

     mov AH,01H
    INT 21H 
 

пока это мой код

 .MODEL SMALL
.STACK 300
.DATA

MSG DB "Enter a number: $"

msg2 DB 10,13, "Adding 5 to the number...$"

msg3 DB 10,13, "the number is: $"

.CODE


;init data segment
MOV AX,@DATA
MOV DS, AX
MOV ES, AX

;PRINT MSG
LEA DX,MSG
MOV AH,09H
INT 21H

;GET CHAR
mov AH,01H
INT 21H
MOV CL,AL


;PRINT MSG
LEA DX,MSG2
MOV AH,09H
INT 21H

;newl
MOV dl, 10
MOV ah, 02h
INT 21h
MOV dl, 13
MOV ah, 02h
INT 21h

;computations
ADD CL, 0x35

;PRINT MSG
LEA DX,MSG3
MOV AH,09H
INT 21H

;print char
MOV DL,CL
MOV AH,02H
INT 21H







EXIT:
MOV AH,4CH
INT 21H

END

 

Как мне выполнить десятичные вычисления из пользовательского ввода на 8086?

Комментарии:

1. Вы очень ретро-вычисляете. Обычно вы выполняете «двоичное» вычисление и печатаете цифру в десятичном виде (таким образом, преобразуя числа). Но, возможно, это назначение, и поэтому ожидается, что вы используете BCD ( en.wikipedia.org/wiki/Intel_BCD_opcode ). Не могли бы вы указать, так ли это?

2. Я должен использовать только прерывания, доступные для 8086 и арифметических инструкций. Я постараюсь разобраться в BCD, спасибо,

3. Но итак, вы должны просто выполнить базовое преобразование из двоичного файла в текст (BCD может помочь, но не так сильно, вы все равно должны преобразовывать значения в строки, BCD позволяет это с гораздо меньшим количеством делений, и в принципе числа могут быть сколь угодно длинными)

4. извините, но я не понимаю, как bcd сможет помочь мне выполнить преобразование, когда предполагается, что пользовательский ввод выполняется в десятичной форме, можете ли вы дать мне подробный рабочий процесс того, что произойдет. например, после того, как пользователь ввел значение 5?

5. Я думаю, ваша проблема просто в том, «как преобразовать двоичные данные в строку на ассемблере».

Ответ №1:

Поэтому, когда я ввожу 5, например: это будет 0x35 0x35 = 0x6A

Вам нужно провести различие между числом и его текстовым представлением.

При вводе через DOS.Получаем символьную функцию 01h и нажимаем 5на клавиатуре, DOS возвращает код ASCII, который представляет текстовый символ «5» (0x35). Если вы собираетесь выполнять какие-либо вычисления с введенным числом, вам нужно оставить код ASCII и начать работать с «истинным значением», которое равно пяти. Преобразование просто заключается в вычитании 48 (0x30).

добавьте к нему 5

Добавление пяти — это то, что есть, а не добавление 0x35 (53), как вы написали.

 ;GET CHAR
 mov AH, 01H
 INT 21H
 sub al, 48          ; From character to number
 MOV CL, AL

...

;computations
 ADD CL, 5           ; Calculation on numbers

...

;print result
 cmp cl, 10
 jb  IsSingleDigitResult
IsDoubleDigitResult:
 mov dl, "1"         ; Separately displaying the 'tens'
 mov ah, 02h
 int 21h
 sub cl, 10          ; Isolating the 'ones'
IsSingleDigitResult:
 add cl, 48          ; From number to character
 MOV DL, CL
 MOV AH, 02H
 INT 21H
 

Для всех входных данных между 5и 9результат добавления 5 будет состоять из 2 цифр. Ваш код должен предвидеть это.