大会 Shift/Rotate

Assembly Shift/Rotate

这些是问题:

我有这个硬件,但我只知道基础知识。如果有人能给我提示如何完成这些问题,那将是一个很大的帮助。我知道这可能是一个孤注一掷的举动,但至少我会学会如何回答这类问题。

您可以使用位逻辑设置和清除整数值的一部分 — 在这种情况下为逻辑 AND 和 OR。

肤浅的例子:我有位值0101;我想设置最低的两位。所以我或与 0011。现在我想清除两个最低位。所以我和 1100.

"and" returns 仅 1,如果两个输入位均为 1。
0 和 0 是 0
1 和 0 是 0
0 和 1 是 0
1 和 1 是 1

所以"clearing"可以通过"anding"用0来完成一点。无论位(b)是什么,b和0都是0

"or" returns 1,如果任一输入位为 1。
0 或 0 是 0
1 或 0 是 1
0 或 1 是 1
1 或 1 是 1

"setting"一点可以用"ORing"用1来完成。无论(b)位是什么,b或1都是1

A​​X为16位 如果你和 AX 与 0000.1111.1111.1111b (= 0x0FFF) 最上面的半字节(4 位)将被清除
(并且 1 不会改变一点,如果它被设置它仍然是 1,如果它是保持未设置0,因此所有不应更改的半字节都与 1)

进行“与”运算

如果您将 AX 与 0000.0000.0000.1111b (= 0x000F) 进行或运算,则将设置低半字节。
(OR 与 0 不会有一点变化,如果它被设置它仍然是 1,如果它是 0 则保持未设置,所以所有其他半字节都与 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 ;将 0xF 添加到 bl。或者,在二进制中,1111。最低有效半字节集。

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

xor 斧头, 斧头;清除 ax 的内容,为 bx

中的内容腾出空间

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

添加斧头,斧头;将 bx 的结果组合回 eax 以获得最终结果

EAX:0011 1100 1001 1111 0000 1100 1001 1111

给你!既然你已经熟悉了轮班操作,我就把最后一部分留给你吧。

干杯!

  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