因为您使用的是汇编程序,而不是编译器。它实际上是将您的助记符和数据翻译成一个平面二进制文件(或更常见的是,包含头文件,即 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 位段中“隔离”每个段。在平面二进制文件中,您可以只在末尾有一个数据部分,也可以在您跳过它/调用函数之间的空白区域中。