根据您的屏幕截图,您的代码似乎是这样的(用nop
' 填充,用 反汇编udcli
):
回声 40 e8 fc 00 01 00 e8 f7 00 e8 f4 ff x{1..244} 43 c3 | sed 's/x[0-9]*\>/90/g' | udcli -o 0x100 -x -16
0000000000000100 40 英寸斧头
0000000000000101 e8fc00 调用字 0x200
0000000000000104 0100 加 [bx+si], ax
0000000000000106 e8f700 调用字 0x200
0000000000000109 e8f4ff 调用字 0x100
000000000000010c *** 从未达到 ***
0000000000000200 43 inc bx
0000000000000201 c3 ret
代码流如下,一行一行:
0000000000000100 40 英寸斧头
ax
增加。
0000000000000101 e8fc00 调用字 0x200
返回地址 0x104 被压入堆栈,ip
(指令指针)设置为 0x200。
0000000000000200 43 inc bx
bx
增加。
0000000000000201 c3 ret
Near return,即ip
从堆栈中弹出。新的ip
将是 0x104。
0000000000000104 0100 加 [bx+si], ax
的值ax
被添加到单词值 at [bx+si]
。
0000000000000106 e8f700 调用字 0x200
返回地址 0x109 被压入堆栈,ip
(指令指针)设置为 0x200。
0000000000000200 43 inc bx
bx
增加。
0000000000000201 c3 ret
Near return,即ip
从堆栈中弹出。新的ip
将是 0x109。
0000000000000109 e8f4ff 调用字 0x100
返回地址 0x10c 被压入堆栈,ip
(指令指针)设置为 0x100。所以这实际上是一个无限递归函数,将耗尽堆栈。
所以你的问题是你没有在CALL 0200
. 恰好有01 00
( add [bx+si], ax
) 并且在 return 之后将被执行,然后是其他未定义的指令。
我的建议:尽快下载任何体面的汇编程序(NASM、YASM、FASM ......),不要毁了你试图用 DEBUG 编写汇编代码的生活。尝试使用 DEBUG 编写汇编程序是注定要失败的尝试。