1

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

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

谢谢!

4

2 回答 2

4

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

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

推入
mov [esp+2],word 0b1000000000000001 ; 一些汇编程序想要单词 ptr
流行音乐

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

角色 eax,16 ; 滚/滚
移动斧头,0b1000000000000001
角色 eax,16 ; 滚/滚

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

和 eax,0x0000ffff
或 eax,0x80010000 ;或/异或/加
于 2013-03-21T18:24:05.053 回答
3

无法访问更高的 16 位,但您可以使用一个小技巧:

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

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

于 2013-03-21T15:38:58.610 回答