程序集x86了解定义Word(DF)指令

dop*_*umi 0 x86 assembly x86-16

如果我的问题很愚蠢的话,我只是开始玩装配一点点,请原谅.

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

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

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

另外,你能解释一下为什么var在地址0010Ah被实例化了吗?我认为这是因为实例化之前的4个结构占用4*16bits = 4*2bytes = 8bytes,因此var就在堆栈之后立即归档.但教学不应该在其他地方吗?一旦程序开始运行,它们是否被加载到堆栈中?

奖金问题:如何查看emu8086中的堆栈内容?

小智 5

因为您使用的是汇编程序,而不是编译器.它实际上是将您的助记符和数据转换为平面二进制文件(或者更常见的是,包括标题,即PE).

dw字面意思是"宣称一个字".它放在$0200代码中的那个地方.如果我们查看这个方便的表,我们可以看到操作码

add r8, r/m8
Run Code Online (Sandbox Code Playgroud)

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

我们得到了整个指令的组合

add ax, [ax+si]
Run Code Online (Sandbox Code Playgroud)

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

modrm:
0 0 0 0 0 0 0 0
| | |   | |___|
|_| |   |  reg1 
mod |___|  (r/m)
     reg2
Run Code Online (Sandbox Code Playgroud)

即: op reg2, reg1

这有点深入,但希望您了解您使用的是汇编程序,而不是编译器,还有一些关于指令编码的知识.有些事情可能有点过时(我已经习惯了32位).

这就是大多数可执行格式具有数据和代码部分的原因,或者是16比特段的"隔离"部分.在平面二进制文件中,您可以在末尾或空白区域中有一个数据部分,您可以在其中使用它/在被调用的函数之间.