我开始学习x86汇编语言问题,这让我很困惑,它如下:
给定32位值,我们可以交换其高16位和低16位。例如,给定
0000 0001 0010 0011 0100 0101 0110 0111
我们可以交换其高16位和低16位来获得值
0100 0101 0110 0111 0000 0001 0010 0011
我知道AX寄存器包含EAX的下半部分,但就此而言。我将不胜感激。
答案 0 :(得分:3)
我知道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
答案 1 :(得分:0)
我可能不明白您的问题,但是我能理解的是您想交换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