Объясняя некоторые 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
mov cx, 5 povtori2: pop dx mov ah, 02h int 21h loop povtori2 exit end start
.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
Любая помощь будет оценена.
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
создать "новую строку" (правильная последовательность в DOS13
10
, другой способ).затем он вытолкнет эти 5 символов один за другим из стека и отобразит каждый на экране.
выход в DOS.
Я не проверял, нет ли ошибки в коде, но если она не содержит ошибок, то результат должен выглядеть следующим образом:
$prompt> exe.exe
abcde
edcba$prompt>
Я не уверен, где после выполнения будет отображаться приглашение DOS, будет ли DOS вставлять дополнительную новую строку, или оно приземлится, как я представлял себе выше. Первый "abcde" вводится пользователем, второй - отображением кода.
РЕДАКТИРОВАТЬ: я забыл, что циклы push+pop in для ввода / вывода будут эффективно инвертировать входную "строку", так как стек является типом очереди / контейнера LIFO (Last In First Out) (я до сих пор не удосужился действительно скомпилировать его и запустите его, так что если вам действительно нужно на 100% ответить, что делает код, запустите его).