0

我刚开始玩一点组装,如果我的问题很愚蠢,请原谅。

我的问题是关于这个(我试图将 100 除以 5,当然是在玩内存和变量!)

https://dl.dropboxusercontent.com/u/78049918/Pics/Capture.png

为什么DW(Define Word)指令会这样执行?我的意思是,我理解所有其他的线,但对我来说尤其是黑暗的线..

另外,你能解释一下为什么 var 在地址 0010Ah 被实例化吗?我认为是因为实例化之前的4个指令占用了4*16bits=4*2bytes=8bytes,所以var紧随其后入栈。但是指令不应该在其他地方吗?一旦程序开始运行,它们是否加载到堆栈中?

额外问题:如何检查 emu8086 中的堆栈内容?

4

1 回答 1

5

因为您使用的是汇编程序,而不是编译器。它实际上是将您的助记符和数据翻译成一个平面二进制文件(或更常见的是,包含头文件,即 PE)。

dw字面意思是“声明一个词”。它$0200位于代码中的那个位置。如果我们看一下这个方便的表格,我们可以看到操作码

add r8, r/m8

虽然我不打算进入整个操作码结构和反汇编,但您也会看到[r]它在操作码后面有一个 modrm 字节的含义。这是另一个方便的表格,显示了 modrm 字节的含义。我们可以看到$00[bx+si]

组装整个指令,我们得到

add ax, [ax+si]

(我们从reg2位中的 0 中得到轴 -ax是第一个被索引的寄存器,cx第 2、dx第 3、bx第 4 等)。这是我的汇编程序中文档中的一个简单表格:

modrm:
0 0 0 0 0 0 0 0
| | |   | |___|
|_| |   |  reg1 
mod |___|  (r/m)
     reg2

IE:op reg2, reg1

这有点深入,但希望您了解您使用的是汇编程序,而不是编译器,并且有点关于指令编码。有些事情可能有点不对劲(我习惯了 32 位)。

这就是大多数可执行格式都有数据和代码段的原因,或者在 16 位段中“隔离”每个段。在平面二进制文件中,您可以只在末尾有一个数据部分,也可以在您跳过它/调用函数之间的空白区域中。

于 2013-05-04T23:12:01.270 回答