0

我正在为一个项目阅读 LILO 的源代码,我偶然发现了这一行

mov dh, [d_dev](bp)

我想知道 mov 指令在这里做什么,我知道如果是

mov dh, [d_dev] 

然后将 d_dev 指向的值放在 dh 中,但是 (bp) 会发生什么。

任何帮助,将不胜感激。

源码链接:https ://github.com/a2o/lilo/blob/master/src/first.S 205行

4

1 回答 1

1

get common.s /* as86 "include" will bypass the CPP */LILO 仍然在顶部使用 AS86(注意)行。

AS86 显然具有op dst, src操作数顺序,但内存操作数语法看起来像是 AT&T 和 Intel 之间的交叉。 [d_dev](bp)是 AT&Td_dev(%bp)或 NASM [d_dev + bp],即基址寄存器 = BP,地址d_dev为 disp8 或 disp16。

同一文件中的前一行将 BP 归零:

xor     bp,bp       ! shorted addressing

大概d_dev是适合有符号 8 位位移的偏移量。是的,标签很快出现在 a 之后.org 6,所以它的地址是一个小位移,并且mov dh, [bp + disp8]只有 3 字节指令,而mov dh, [disp16]4 字节指令(操作码 + modrm + disp16)。

mov dh, [d_dev](bp)与 做同样的事情,mov dh, [d_dev]但机器码少一个字节,因为 BP=0。

于 2018-06-18T17:48:25.033 回答