assembly - 为什么使用临时寄存器将值传递给段寄存器?

标签 assembly x86 gnu-assembler

我一直在关注一些编写汇编的示例,它们使用临时寄存器将立即值传递到段寄存器。为什么需要先将立即数放入某个寄存器,然后再放入段寄存器?
示例:

movw $0x7c00, %ax
movw %ax, %ds
...
...
movw $0x6000, %ax
movw %ax, %ss

为什么不直接将立即数放入段寄存器中?

movw $0x7c00, %ds
...
movw $0x6000, %ss

最佳答案

因为英特尔没有提供相关说明(mov seg, [ptr], mov seg, imm16 等)。所以你必须这样做。结果很好,因为我们不再使用段/选择器了。

但这并非毫无希望。有带有段的 lea 变体指令,可以一次加载段和偏移量:

les di, [someptr]

(实际上意味着:di = [someptr]; es = [someptr+2])

您还可以push/pop来避免寄存器交换,当然是以内存访问延迟为代价的:

push immediate
pop  es

许多寄存器仅专注于某个目的,并且对于某些操作来说不可互换(bx 用于偏移,cx 用于计数,dx 用于结果的高阶,ax 表示结果)。因此,在机器代码文化中,使用临时寄存器并交换它们并不奇怪。

关于assembly - 为什么使用临时寄存器将值传递给段寄存器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25702277/

相关文章:

x86 - sfence 文档中的 "serializing operation"是什么意思?

visual-c++ - 编译代码中的冗余指令

caching - 缓存行刷新是否访问 TLB?

windows - 页面文件中的物理页面和页面之间有什么关系?

c - 如何将 C 目标文件与汇编语言目标文件链接起来?

assembly - 气体 : too many memory reference

macos - 在 OSX 中安装 GNU 汇编器

gcc - Asm 代码说明

c - VirtualBox 无法加载 .img 或 .flp 文件

c - 段错误仅出现在 GDB 中