我开始学习x86汇编语言问题,这让我很困惑,它如下:
给定32位值,我们可以交换其高16位和低16位。例如,给定
0000 0001 0010 0011 0100 0101 0110 0111
我们可以交换它的高16位和低16位来获得值
0100 0101 0110 0111 0000 0001 0010 0011
我知道AX寄存器包含WAX的下半部分,但这就是它。任何帮助,将不胜感激。
我知道AX寄存器包含EAX的下半部分,但就此而言。
EAX
寄存器是一个32位寄存器,因此它可以保存您的32位值。其位编号为0到31。
这是位编号的方式:
0000 0001 0010 0011 0100 0101 0110 0111
^ ^ ^ ^
| | | bit 0
| | bit 15
| bit 16
bit 31
EAX
的下半部分占用从0到15的位。
EAX
的上半部分占据了从16到31的位数。
AX
寄存器是一个16位寄存器,位于较大的EAX
寄存器的下半部分。它的位编号从0到15。
EAX
登记册的上半部分没有单独的名称!
交换EAX
的高16位和低16位需要使用以下内容旋转内容16次:
rol eax, 16 ;Rotating to the left
使用时会显示相同的值:
ror eax, 16 ;Rotating to the right
我可能不明白你的问题,但我能感觉到你想要交换EAX寄存器的高16位和低16位,对吗?您可以在Assembly lang中使用PTR运算符。虽然PTR主要用于我们想要处理32位寄存器的特定部分但我们可以使用它来移动寄存器中的值然后处理它。你可以像这样使用ptr:
**.data**
myDouble DWORD 012345678h
**.code**
Mov AX, WORD PTR myValue ; Loads 5678
Mov AX, WORD PTR myValue + 1 ; Loads 3456