【问题标题】:Explaining some ASM解释一些 ASM
【发布时间】:2017-06-05 13:14:23
【问题描述】:

我有这个 ASM 代码,我需要帮助解释它,主要是宏。我尝试使用 ASM 到 C 的反汇编工具,但无法让它处理多个文件,而且其他文件远远超出了我的预算。
宏.inc:

pokazvane_cifra_dl macro

推斧
推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: 流行音乐 mov 啊, 02h 整数 21 小时 循环 povtori2 出口 结束开始

我们将不胜感激。

【问题讨论】:

  • 宏?有4个……哪一个?您是否查阅过 DOS 中断参考资料?
  • 这是您的母语吗?它们看起来很容易解释,你有什么不明白的?
  • @Jester 尽管我看起来很努力,但我只能看到 3 个。
  • @tofro 考虑到格式损坏... :) 有 4 个。
  • 也许在尝试对任何装配进行逆向工程之前,请先参加装配课程,这样您就会了解说明的作用。实际上,RE 通常比编写自己的代码要难一些,所以如果你连这些琐碎的代码都不懂,那么尝试做 RE 是没有意义的。

标签: assembly x86 reverse-engineering dos


【解决方案1】:

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周围做push/pop ax@。


代码本身:

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

  • 显示两个字符1013 来创建“新行”(DOS 中的正确顺序是1310,反之亦然)。

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

  • 退出到 DOS。

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

$prompt> exe.exe
    abcde
    edcba$prompt>

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


编辑:我忘记了输入/输出循环中的 push+pop 会有效地反转输入“字符串”,因为 stack 是 LIFO(后进先出)类型的队列/容器(我仍然没有费心去真正编译和运行它,所以如果你真的需要 100% 回答代码的作用,请运行它)。

【讨论】:

  • 非常感谢,你是生命的救星。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多