解释一些ASM

时间:2017-01-20 14:04:37

标签: assembly x86 reverse-engineering dos

我有这个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

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

任何和所有帮助将不胜感激。

1 个答案:

答案 0 :(得分:3)

pokazvane_cifra_dl macro:将值dl+48显示为ASCII字符。

如果dl的值为09,则会显示相应的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:显示来自dl的ASCII字符。不知道为什么名称显示为eho_al,而它根本不会使用al,而是会破坏al中的值,如果它不会push/pop ax int 21h

代码本身:

  • 将从输入中读取5个字符(ASCII),并在堆栈中显示push

  • 显示两个字符1013以创建“新行”(DOS中的正确序列为13 10,反之亦然。 / p>

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

  • 退出DOS。

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

$prompt> exe.exe
    abcde
    edcba$prompt>

我不确定执行后DOS提示符落在哪里,DOS是否会插入额外的新行,或者它会像我想象的那样降落。第一个“abcde”是来自用户的输入,第二个是由代码完成的显示。

编辑:我忘了push + pop in循环输入/输出将有效地反转输入“string”,因为 stack 是LIFO(后进先出)类型的队列/容器(I仍然没有真正编译并运行它,所以万一你真的需要100%回答代码的作用,运行它。