冒号是什么意思 : 在 x86 汇编 GAS 语法中与 %ds:(%bx) 一样



我是x86汇编的新手,我正在尝试理解本文档中的代码: http://www.cs.cmu.edu/~410-s07/p4/p4-boot.pdf 第3页:

movw $0x1234, %ax
movw %ax, %ds
movw $0x5678, %bx
# The following instruction is the same as "movw $0x1337, (%bx)".
movw $0x1337, %ds:(%bx) # Places 0x1337 into memory word 0x179b8.
# Segment Base: %ds << 4: 12340
# Offset: %bx: + 5678
# -------
# Linear Address: 179b8

但我不明白命令:

movw $0x1337, %ds:(%bx) # Places 0x1337 into memory word 0x179b8.
为什么将 %ds 与 (%bx)

连接与 ((%ds <<4) | %bx) 相同?

由于我处于实模式(16 位),连接不应该是 %ds <<8 ? 而不是 %ds <<4

为什么括号就在 %bx 附近?而不是围绕整个结构,例如:movw $0x1337,(%ds:%bx)?

在实模式下,段寄存器用于提供 20 位地址。在这种情况下,数据段寄存器ds提供地址的"高"16位:(0x1234 <<4 = 0x12340),段中的偏移量由下式给出:0x5678,得到:0x179b8。

数据段寄存器是隐式的,因此不必使用:ds:(%bx) .如果您使用的是另一个段寄存器,例如 es ,则需要显式。

我希望我已经理解了你的问题。至于为什么它没有写成(%ds:%bx),这实际上只是你坚持的语法决定。

最新更新