装配班次/旋转

时间:2016-02-25 13:44:45

标签: assembly rotation shift

这些是问题:

我有这个,但我只懂基础知识。如果有人能给我一些关于如何完成这些问题的提示,那将是一个很大的帮助。我知道这可能是一个绝望的举动,但至少我会学习如何回答这些问题。

4 个答案:

答案 0 :(得分:1)

"和"如果两个输入位均为1,则仅返回1 0和0是0
1和0是0
0和1是0
1和1是1

所以"清算"有点可以通过" anding"无论位(b)是什么,b和0都是0

"或"如果任一输入位为1,则返回1 0或0是0
1或0是1
0或1是1
1或1是1

"设置"有点可以通过" ORing"无论位(b)是什么,b或1是1

AX是16位 如果和AX与0000.1111.1111.1111b(= 0x0FFF),最顶部的半字节(4位)将被清除
(AND与1不会改变位,如果它被设置则保持为1,并保持如果它为0则取消设置,所以不应更改的所有半字节都与1进行AND运算

如果OR AX与0000.0000.0000.1111b(= 0x000F),则低位半字节将全部设定。
(OR为0时不会改变,如果设置为0则保持为1,如果为0则保持未设置,所以其他所有半字节都与0进行“或”运算)

答案 1 :(得分:0)

您可以使用位逻辑设置和清除积分值的一部分 - 在这种情况下,逻辑AND和OR。

肤浅的例子:我的位值为0101;我想设置最低的两位。所以我和0011一起使用。现在我要清除两个最低位。所以我和1100。

答案 2 :(得分:0)

理解这些操作的最佳方法是逐步完成它们。我会尽力解释这个过程。每个步骤我都会包含两个寄存器的状态,以便您可以跟随。为了保持EAX的上限值,我们必须先将其内容移到另一个寄存器中进行操作。

开始:
EAX:0011 1100 1001 1111 1011 1100 1001 1111

mov ebx,eax;将eax的内容复制到ebx

EAX:0011 1100 1001 1111 1011 1100 1001 1111
EBX:0011 1100 1001 1111 1011 1100 1001 1111

shl ebx,24;这清除了我们不关心的ebx shr ebx,24;转回初始位置

EAX:0011 1100 1001 1111 1011 1100 1001 1111
EBX:0000 0000 0000 0000 0000 0000 1100 1001

shl ebx,4;向左移4位。 bx是下一步我们想要的地方。

EAX:0011 1100 1001 1111 1011 1100 1001 1111
EBX:0000 0000 0000 0000 0000 1100 1001 0000

添加bl,0Fh;向bl添加0xF。或者,在二进制中,1111。最不重要的半字节集。

EAX:0011 1100 1001 1111 1011 1100 1001 1111
EBX:0000 0000 0000 0000 0000 1100 1001 1111

xor ax,ax;清除斧头的内容,为bx中的内容腾出空间

EAX:0011 1100 1001 1111 0000 0000 0000 0000
EBX:0000 0000 0000 0000 0000 1100 1001 1111

添加ax,bx;将bx的结果合并回eax以获得最终结果

EAX:0011 1100 1001 1111 0000 1100 1001 1111

你有它!既然您熟悉轮班操作,我会将最后一部分留给您。

干杯!

答案 3 :(得分:0)

  1. 要清除最有效的半字节并设置AX的最小有效位半字节,您可以写:

    and ax, 0FFFh  ;Clears the top nibble
    or  ax, 000Fh  ;Sets the bottom nibble
    

    不使用and / or,使用轮班:

    shl ax, 4      ;Moves the middle part into AH
    mov al, 0F0h   ;Prepares for a set low nibble
    shr ax, 4      ;Puts everything in place
    
  2. 使用班次计算10 * AX:

    shl ax, 1      ;Calculate 2*AX
    mov dx, ax     ;Store in DX
    shl ax, 2      ;Continue calculating 8*AX
    add ax, dx     ;Makes AX = 8*AX + 2*AX