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

时间:2013-09-11 08:51:43

标签: assembly syntax x86 gas real-mode

我是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&lt;&lt;&lt; 4)|%bx)相同?

当我处于实模式(16位)时,串联不应该是%ds&lt;&lt; 8 ?代替%ds&lt;&lt;的 4

为什么括号只是%bx左右?而不是整个结构,如:movw $ 0x1337,(%ds:%bx)?

1 个答案:

答案 0 :(得分:6)

在实模式下,段寄存器用于提供20位地址。在这种情况下,数据段寄存器ds提供地址的“高”16位:(0x1234 <&lt; 4 = 0x12340),并且给出段中的偏移通过:0x5678,得到:0x179b8。

数据段寄存器隐式,因此不必使用:ds:(%bx)。如果您正在使用其他段寄存器,例如es,则需要明确。

我希望我理解你的问题。至于为什么它不是写成(%ds:%bx),那真的只是一个你坚持的语法决定。