x86程序集mov指令LILO

时间:2018-06-18 17:21:28

标签: assembly x86-16 bootloader as86

我正在阅读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行

1 个答案:

答案 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。