我正在为一个项目阅读 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行
我正在为一个项目阅读 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行
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。