Сборка 386: неожиданный вывод при использовании прерывания 21h с функцией 02h - PullRequest
0 голосов
/ 19 февраля 2011

Я начинаю сегодня со сборки (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

1 Ответ

1 голос
/ 19 февраля 2011

Да, если я правильно помню, INT 21h, и любое прерывание разрешено и действительно может перезаписать любой из регистров AX, CX и DX.

Ваш самый простой обходной путь, вероятно,

PUSH AX

;Displays first caracter (from the right of the string)
MOV DL, AH
MOV AH, 02h
INT 21h

POP AX

;Displays second character (from the right of the string)
MOV DL, AL
MOV AH, 02h
INT 21h
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...