jrh*_*4xb 2 x86 assembly gnu-assembler
我一直在关注编写汇编的几个例子,他们使用临时寄存器将立即值传递给段寄存器.为什么在将其置于段寄存器之前需要将其置于某个寄存器中?
例:
movw $0x7c00, %ax
movw %ax, %ds
...
...
movw $0x6000, %ax
movw %ax, %ss
Run Code Online (Sandbox Code Playgroud)
为什么不直接把直接放在段寄存器中?
movw $0x7c00, %ds
...
movw $0x6000, %ss
Run Code Online (Sandbox Code Playgroud)
由于英特尔没有为提供者的指令(mov seg, [ptr]
,mov seg, imm16
等).所以你必须这样做.结果很好,因为我们不再使用段/选择器了.
但这并非毫无希望.存在lea
带有段的变体指令,它一次加载段和偏移量:
les di, [someptr]
Run Code Online (Sandbox Code Playgroud)
(这实际上意味着:di = [someptr]; es = [someptr+2]
)
你还可以push
/ pop
避免寄存器交换,当然是以内存访问延迟为代价:
push immediate
pop es
Run Code Online (Sandbox Code Playgroud)
许多寄存器仅专注于某个目的,并且对于某些操作不可互换(bx
对于偏移,cx
对于计数,dx
对于更高阶的结果,ax
对于结果).因此,在机器代码文化中使用临时寄存器并交换它们并不奇怪.