【问题标题】:x86 assembly mov instruction LILOx86 汇编 mov 指令 LILO
【发布时间】:2018-06-18 17:21:28
【问题描述】:

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

【问题讨论】:

  • 在组装之前会发生什么宏预处理?这是 GAS .att_syntax noprefix 还是什么?在那种情况下,(bp) 将是一个以 BP 寄存器为基数的内存操作数,[d_dev] 作为位移。大概[d_dev] 被一个宏预处理器取代,比如 M4 什么的。你能链接到出现这个的源文件吗?
  • @PeterCordes 我相信早期版本的 LILO 使用 AS86 作为它的汇编器(不是 GNU 的 as)
  • @PeterCordes 我应该更具体一点。实际语法是由 Minix 语法兼容模式下的 as86 解析的。在 Minix 中,方括号和圆括号的含义是相反的。所以它更像是普通 AS86 语法中的 mov dh, (d_dev)[bp] 或 NASM 语法中的 mov dh, [d_dev+bp]
  • @MichaelPetch:谢谢,我对 AS86 一无所知,但这就是在 OP 链接整个文件后我能够从上下文推断的意思。

标签: assembly x86-16 bootloader as86


【解决方案1】:

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

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 位位移的偏移量。是的,标签很快出现在.org 6 之后,所以它的地址是一个小的位移,mov dh, [bp + disp8] 只是一个 3 字节指令,而mov dh, [disp16] 是一个 4 字节指令(操作码 + modrm + disp16)。

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

【讨论】: