最高16位的EAX

时间:2013-03-21 15:25:18

标签: assembly x86 cpu-registers pci

我想形成一个PCI地址。如何用汇编语言将16位写入EAX(而不是AX)? 示例:写入0b1000000000000001

EAX before
|_____16-bit_____||_______AX_______|
EAX after:
|1000000000000001||_______AX_______|

谢谢!

2 个答案:

答案 0 :(得分:3)

不可能访问更高的16位,但你可以使用一个小技巧:

push    ax
mov     ax, 1000000000000001b
shl     eax, 16
pop     ax

这会将高16位设置为您想要的任何值,而不会破坏低16位。

答案 1 :(得分:3)

有很多方法可以做到,这里有一些。

使用堆栈,不会修改任何标志:

push eax
mov  [esp+2],word 0b1000000000000001 ; some assemblers want word ptr
pop  eax

向左或向右旋转,不需要堆叠,但修改标志:

rol  eax,16                ; rol / ror
mov  ax,0b1000000000000001
rol  eax,16                ; rol / ror

对于硬编码值(如问题所示),您还可以and / or / xor使用add。对于非硬编码值,您需要将值移到其他寄存器或内存中以使用此方法:

and  eax,0x0000ffff
or   eax,0x80010000       ; or / xor / add