解释一些 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 字符。

如果dl09之间的值,它会显示相应的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 压入堆栈

  • 显示两个字符1013来创建"new line"(在DOS中正确的顺序是1310,其他方式)。

  • 然后它将这 5 个字符从堆栈中一个接一个地弹出,并在屏幕上显示每个字符。

  • 退出到 DOS。

我没有验证代码中没有错误,但如果它没有错误,那么输出应该如下所示:

$prompt> exe.exe
    abcde
    edcba$prompt>

我不确定执行后DOS提示符会落在哪里,DOS是否会插入额外的换行符,还是会像我上面想象的那样落下。第一个 "abcde" 是用户输入的,第二个是由代码完成的显示。


编辑:我忘记了 input/output 循环中的 push+pop 会有效地反转输入 "string",因为 stack 是后进先出(后进先出) Out) queue/container 类型(我仍然懒得真正编译它和 运行 它,所以如果你真的需要 100% 回答代码的作用,运行 它)。