assembly - 冒号 : mean in x86 assembly GAS syntax as in %ds:(%bx)? 是什么意思

标签 assembly syntax x86 gnu-assembler 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 << 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),这实际上只是一个你所坚持的语法决定。

关于assembly - 冒号 : mean in x86 assembly GAS syntax as in %ds:(%bx)? 是什么意思,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18736663/

相关文章:

objective-c - 为什么 clang 优化会破坏我的内联汇编代码?

php - 语法错误,意外的 T_ENCAPSED_AND_WHITESPACE,需要 T_STRING 或 T_VARIABLE 或 T_NUM_STRING

java - 为什么为非泛型方法或构造函数提供显式类型参数会编译?

x86 - 谁初始化 IDT、内核还是处理器?

assembly - 汇编器中的Printf无法打印

assembly - sbb指令和进位标志的使用

linux - 为什么反汇编代码中有一些 "meaningless"内存槽?

python - 在 Python 3 中使用多个输入变量

C函数不可调用

c++ - boolean 值在编译器中为 8 位。对它们的操作效率低下吗?