我想交换两位的位置。这该怎么做?

时间:2019-03-07 15:22:41

标签: assembly x86 x86-emulation

我遇到一个问题,我必须编写一个程序,以使第一段的偏移地址的最后一位成为第二段的偏移地址的第一位。例如,如果给我ABCDH,则第二个地址的偏移地址应为DCBAH。我只是专注于偏移地址的交换,而现在却忽略了基地址:

MOV AX,ABCDH
ROR AX,16  ;    this will rotate the value of AX 16 times

现在我们有了CDABH。现在我想交换D和C的位置。我会使用SAR命令吗?

1 个答案:

答案 0 :(得分:3)

MOV AX,ABCDH
ROR AX,16  ;    this will rotate the value of AX 16 times
     

现在我们有CDABH

AX寄存器包含16位。当您将这16位旋转16次时,您将获得与开始时相同的值!

  

例如,如果给我ABCDH,则第二个地址的偏移地址应为DCBAH

因此,您想从ABCDh转到DCBAh。

AX寄存器分为两半。下半部分名为AL,上半部分名为AH。您可以分别对这两个部分进行操作。

指令mov ax, 0ABCDh将值0ABh放入AH,并将值0CDh放入AL

mov     ax, 0ABCDh  ; AH = 0ABh AL = 0CDh
rol     al, 4       ; AH = 0ABh AL = 0DCh 
rol     ah, 4       ; AH = 0BAh AL = 0DCh
xchg    al, ah      ; AH = 0DCh AL = 0BAh

现在终于AX=0DCBAh


以上所有内容均处理4位数量。我们称这些轻咬。
您可以使用1010101111001101b之类的二进制表示形式来编写十六进制值0ABCDh。您可以看到有16位。

对齐的位组具有特殊名称:

  • 每4位组成一个半字节,您可以看到有4个半字节。 (1010 1011 1100 1101)
  • 每8位组成一个字节,您可以看到有2个字节。 (10101011 11001101)
  • 每16位构成一个,您可以看到其中有1个字。 (1010101111001101)