2013-03-21 36 views
0

我想要形成一个PCI地址。我怎样才能用汇编语言将16位写入EAX(而不是AX)? 例如:写0b1000000000000001最高16位的EAX

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

谢谢!

+0

EAX只能作为完整的32位访问,所以您必须左移值。 – 2013-03-21 15:28:10

+0

如何用一个掩码值(或类似于'10000000000000010000000000000000')对它进行操作? – Linuxios 2013-03-21 15:28:34

+0

“或”是决定之一,但关于使用堆栈是什么? – Vanzef 2013-03-21 15:34:46

回答

3

这是不可能访问高16位,但你可以用一个小技巧:

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

这台高16位到你想要不破坏低16位的任意值。

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 

对于硬编码值(如在问题中),你也可以使用andor/xor/add。对于非硬编码的值,您需要将某个其他寄存器或内存中的值转换为使用此方法:

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

谢谢,哪种变体更好(更快)? – Vanzef 2013-03-22 07:18:23

+0

@Vanzef对于硬编码值,我假设最后一个。其他有3条指令,所有指令都依赖于先前指令的结果,所以它们不能同时执行。最后的'和','或'解决方案只有2条指令,所以我相信它通常是其中最快的。 – nrz 2013-03-22 07:38:08