我想要形成一个PCI地址。我怎样才能用汇编语言将16位写入EAX(而不是AX)? 例如:写0b1000000000000001最高16位的EAX
EAX before
|_____16-bit_____||_______AX_______|
EAX after:
|1000000000000001||_______AX_______|
谢谢!
我想要形成一个PCI地址。我怎样才能用汇编语言将16位写入EAX(而不是AX)? 例如:写0b1000000000000001最高16位的EAX
EAX before
|_____16-bit_____||_______AX_______|
EAX after:
|1000000000000001||_______AX_______|
谢谢!
这是不可能访问高16位,但你可以用一个小技巧:
push ax
mov ax, 1000000000000001b
shl eax, 16
pop ax
这台高16位到你想要不破坏低16位的任意值。
有很多方法可以做到,这里有一些。
使用堆栈,不修改任何标志:
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
EAX只能作为完整的32位访问,所以您必须左移值。 – 2013-03-21 15:28:10
如何用一个掩码值(或类似于'10000000000000010000000000000000')对它进行操作? – Linuxios 2013-03-21 15:28:34
“或”是决定之一,但关于使用堆栈是什么? – Vanzef 2013-03-21 15:34:46