1

所以,我在搞乱组装,偶然发现了奇怪的东西。在写任何东西之前,我将寄存器设置为这些值:

AX 0000, BX 0000, SP 00FD.

假设我们编写了简单的代码,增加了寄存器 AX 和 BX:

A100
INC AX
CALL 0200

A200
INC BX
RETN

写完之后,我试着用T命令一一查看执行命令时寄存器是如何变化的。第一次,它增加AX、移动到0200、增加BX和返回。这是奇怪的一点:当它返回时,它执行命令: ADD [BX+SI],AX然后0200再次调用。

当它0200再次调用时,它会重复自己,但是现在,当它返回时,它会返回到CALL 0100command(而不是 to CALL 0200)并AX再次增加,依此类推。为什么会这样?

我有完整输出的图像,也许这可以帮助更好地理解我的问题?: http: //s18.postimg.org/wt6eracg9/Untitled.png

4

2 回答 2

3

根据您的屏幕截图,您的代码似乎是这样的(用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 编写汇编程序是注定要失败的尝试。

于 2013-11-10T11:44:03.517 回答
2

可能的原因是您没有退出,您没有使用 DOS 的0x4c服务,并且程序绑定了代码并开始执行随机命令或执行流程遇到了一些ret使用 nocall的指令,然后它会运行不料。

于 2013-11-10T11:34:40.153 回答