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