Я начинаю сегодня со сборки (i386) и пытаюсь вывести символы из двузначного числа. Способ, который я нашел после некоторого повторного поиска, состоит в том, чтобы разделить мое число на 10d, чтобы получить остаток и частное, а затем использовать прерывание 21h с функцией 02h, чтобы вывести отдельно 2 цифры.
Моя проблема в том, что с приведенным ниже кодом я ожидаю 53 как вывод, но у меня есть 55. Похоже, что значение, сохраненное в регистре AL, изменено (я попытался использовать переменные для хранения коэффициента и остатка, и в этом случае вывод правильный). Я хочу понять, почему у меня нет ожидаемого результата с моим кодом ниже.
Я что-то не так делаю? Кто-нибудь может объяснить мне подробно, пожалуйста? Кроме того, что касается производительности, можете ли вы подтвердить, что лучше использовать регистры, а не хранить частное и остаток в переменных.
.386
code segment use16
assume cs:code, ds:code, ss:code
org 100h ;offset décalés de 100h=256
label1:
;Division to get quotient and remainder
MOV AX, 35d
DIV divisor
;If the divider is a byte then
;the quotient will be stored on the AL register
;and the residue on AH
ADD AH, 30h
ADD AL, 30h
;Displays first caracter (from the right of the string)
MOV DL, AH
MOV AH, 02h
INT 21h
;Displays second character (from the right of the string)
MOV DL, AL
MOV AH, 02h
INT 21h
RET
divisor db 10d
code ends
end label1