解释一些 ASM
Explaining some ASM
我有这个 ASM 代码,我需要帮助解释它,主要是宏。我已经尝试过 ASM 到 C 的反汇编工具,但无法让它处理多个文件,而其他文件远远超出了我的预算。
macro.inc:
pokazvane_cifra_dl macro
push ax
push dx
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</p>
mov cx, 5
povtori2:
pop dx
mov ah, 02h
int 21h
loop povtori2
exit
end start
我们将不胜感激。
pokazvane_cifra_dl macro
:将值 dl+48
显示为 ASCII 字符。
如果dl
是0
到9
之间的值,它会显示相应的ASCII数字'0'
-'9'
,所以为什么宏的名称类似于 "display digit"(尽管您也可以使用 dl = 40
来调用它,它会显示 ASCII 字符 'X'
)。
exit macro
: returns 控制权回到 DOS(整个源是 DOS-platform 目标,即 16 位实模式 x86 程序集 int 21h
用于系统服务,即需要 DOS-like 操作系统才能工作)。
pokazvane_znak_dl macro
:与第一个略有不同,这次显示任何 ASCII 字符,如 pokazvane_znak_dl 'X'
显示 'X'
。
eho_al macro
:显示来自 dl
的 ASCII 字符。不知道为什么名字说 eho_al
,虽然它根本不会使用 al
,相反它会破坏 al
中的值,如果它不会做 push/pop ax
int 21h
.
代码本身:
将从输入中读取 5 个字符 (ASCII),并将它们 push
压入堆栈
显示两个字符10
和13
来创建"new line"(在DOS中正确的顺序是13
10
,其他方式)。
然后它将这 5 个字符从堆栈中一个接一个地弹出,并在屏幕上显示每个字符。
退出到 DOS。
我没有验证代码中没有错误,但如果它没有错误,那么输出应该如下所示:
$prompt> exe.exe
abcde
edcba$prompt>
我不确定执行后DOS提示符会落在哪里,DOS是否会插入额外的换行符,还是会像我上面想象的那样落下。第一个 "abcde" 是用户输入的,第二个是由代码完成的显示。
编辑:我忘记了 input/output 循环中的 push+pop 会有效地反转输入 "string",因为 stack 是后进先出(后进先出) Out) queue/container 类型(我仍然懒得真正编译它和 运行 它,所以如果你真的需要 100% 回答代码的作用,运行 它)。
我有这个 ASM 代码,我需要帮助解释它,主要是宏。我已经尝试过 ASM 到 C 的反汇编工具,但无法让它处理多个文件,而其他文件远远超出了我的预算。
macro.inc:
pokazvane_cifra_dl macro
push ax push dxad 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</p> mov cx, 5 povtori2: pop dx mov ah, 02h int 21h loop povtori2 exit end start
我们将不胜感激。
pokazvane_cifra_dl macro
:将值 dl+48
显示为 ASCII 字符。
如果dl
是0
到9
之间的值,它会显示相应的ASCII数字'0'
-'9'
,所以为什么宏的名称类似于 "display digit"(尽管您也可以使用 dl = 40
来调用它,它会显示 ASCII 字符 'X'
)。
exit macro
: returns 控制权回到 DOS(整个源是 DOS-platform 目标,即 16 位实模式 x86 程序集 int 21h
用于系统服务,即需要 DOS-like 操作系统才能工作)。
pokazvane_znak_dl macro
:与第一个略有不同,这次显示任何 ASCII 字符,如 pokazvane_znak_dl 'X'
显示 'X'
。
eho_al macro
:显示来自 dl
的 ASCII 字符。不知道为什么名字说 eho_al
,虽然它根本不会使用 al
,相反它会破坏 al
中的值,如果它不会做 push/pop ax
int 21h
.
代码本身:
将从输入中读取 5 个字符 (ASCII),并将它们
push
压入堆栈显示两个字符
10
和13
来创建"new line"(在DOS中正确的顺序是13
10
,其他方式)。然后它将这 5 个字符从堆栈中一个接一个地弹出,并在屏幕上显示每个字符。
退出到 DOS。
我没有验证代码中没有错误,但如果它没有错误,那么输出应该如下所示:
$prompt> exe.exe
abcde
edcba$prompt>
我不确定执行后DOS提示符会落在哪里,DOS是否会插入额外的换行符,还是会像我上面想象的那样落下。第一个 "abcde" 是用户输入的,第二个是由代码完成的显示。
编辑:我忘记了 input/output 循环中的 push+pop 会有效地反转输入 "string",因为 stack 是后进先出(后进先出) Out) queue/container 类型(我仍然懒得真正编译它和 运行 它,所以如果你真的需要 100% 回答代码的作用,运行 它)。