我正在阅读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行
答案 0 :(得分:1)
LILO仍在顶部使用AS86(注意get common.s /* as86 "include" will bypass the CPP */
)行。
AS86显然具有op dst, src
操作数顺序,但内存操作数语法看起来像是AT& T和Intel之间的交叉。 [d_dev](bp)
是AT& T d_dev(%bp)
或NASM [d_dev + bp]
,即基址寄存器= BP,地址d_dev
为disp8或disp16。
同一文件中的早期行0:
xor bp,bp ! shorted addressing
据推测,d_dev
是一个适合有符号8位位移的偏移量。是的,标签在.org 6
之后很快出现,因此它的地址是一个小位移,mov dh, [bp + disp8]
只是一个3字节指令,而mov dh, [disp16]
是一个4字节指令(操作码) + modrm + disp16)。
所以mov dh, [d_dev](bp)
与mov dh, [d_dev]
做同样的事情,但在机器码的一个字节中,因为BP = 0。