#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 цифр. Ваш код должен предвидеть это.