Объясняя некоторые ASM

У меня есть этот код ASM, и мне нужна помощь в объяснении его, в основном макрос. Я попробовал инструмент разборки ASM to C, но не смог заставить его работать с несколькими файлами, а остальные были намного выше моего бюджета.
macro.inc:

pokazvane_cifra_dl macro

 толкающий топор
толчок дх

ad dl,30h
mov ah, 02h
int 21h

pop dx
pop ax
endm

exit macro

mov ah,4ch
int 21h
endm

pokazvane_znak_dl macro nomer_znak

push ax
push dx
mov dl, nomer_znak
mov ah,02h
int 21h
pop dx
pop ax

endm

eho_al macro
push ax
mov ah, 02h
int 21h
pop ax

endm

program.asm:

include macro.inc

.model small .stack 100h .data .code start: mov cx,5 povtori1: mov ah,01h int 21h mov ah,0h push ax loop povtori1 pokazvane_znak_dl 10d pokazvane_znak_dl 13d

mov cx, 5 povtori2: pop dx mov ah, 02h int 21h loop povtori2 exit end start

Любая помощь будет оценена.

1 ответ

Решение

pokazvane_cifra_dl macro: отображает значение dl+48 как символ ASCII.

Если dl это значение от 0 в 9, он покажет соответствующую цифру ASCII '0'-'9', так что причина, по которой имя макроса выглядит как "отображаемая цифра" (хотя вы можете также назвать его, например, dl = 40 и он будет отображать ASCII-символ 'X').


exit macro: возвращает управление обратно в DOS (весь источник нацелен на платформу DOS, т.е. 16-битная сборка x86 реального режима с int 21h используется для системных служб, т. е. для работы требуется DOS-подобная операционная система).


pokazvane_znak_dl macro: незначительное отклонение от первого, на этот раз отображение любого символа ASCII, например pokazvane_znak_dl 'X' для отображения 'X',


eho_al macro: отображает ASCII символ из dl, Не уверен, почему имя говорит eho_alпока не буду использовать al вообще, вместо этого это разрушило бы ценность в al, если это не сработает push/pop ax вокруг int 21h,


Сам код:

  • будет читать 5 символов (ASCII) из ввода, и push их в стеке

  • отображать два символа 10 а также 13 создать "новую строку" (правильная последовательность в DOS 1310, другой способ).

  • затем он вытолкнет эти 5 символов один за другим из стека и отобразит каждый на экране.

  • выход в DOS.

Я не проверял, нет ли ошибки в коде, но если она не содержит ошибок, то результат должен выглядеть следующим образом:

$prompt> exe.exe
    abcde
    edcba$prompt>

Я не уверен, где после выполнения будет отображаться приглашение DOS, будет ли DOS вставлять дополнительную новую строку, или оно приземлится, как я представлял себе выше. Первый "abcde" вводится пользователем, второй - отображением кода.


РЕДАКТИРОВАТЬ: я забыл, что циклы push+pop in для ввода / вывода будут эффективно инвертировать входную "строку", так как стек является типом очереди / контейнера LIFO (Last In First Out) (я до сих пор не удосужился действительно скомпилировать его и запустите его, так что если вам действительно нужно на 100% ответить, что делает код, запустите его).

Другие вопросы по тегам