【问题标题】:Assembly Shift/Rotate装配移位/旋转
【发布时间】:2016-02-25 13:44:44
【问题描述】:

这些是问题:

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

【问题讨论】:

  • 您必须只使用轮班吗? 2 听起来像是 AND / OR 的工作。 3 听起来也不可能使用 only 移位或旋转。听起来像是 LEA 的工作(它确实转移并添加了相同的 insn):lea ecx, [rcx*2]/lea eax, [rcx + 8*rax]。或者更简单地说,用 x2、x5 做 x10:shl eax / lea eax, [rax + 4*rax]

标签: assembly rotation shift


【解决方案1】:

"and" 只返回 1,如果两个输入位都是 1。
0 和 0 是 0
1和0就是0
0和1是0
1 和 1 是 1

所以“清除”一个位可以通过与 0“与”来完成。无论位 (b) 是什么,b 和 0 都是 0

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

“设置”位可以通过与 1 进行“或”运算来完成。无论 (b) 位是什么,b 或 1 都是 1

AX 是 16 位的 如果您与 AX 与 0000.1111.1111.1111b (= 0x0FFF ) 最高半字节(4 位)将被清除
(与 1 不会改变一点,如果设置它保持 1,如果它是 0 则保持未设置,因此所有不应更改的半字节都与 1) 进行 AND 运算

如果您将 AX 与 0000.0000.0000.1111b ( = 0x000F ) 进行或操作,则下半字节将全部设置。
(OR 与 0 不会有任何变化,如果设置它仍然是 1,如果它是 0 则保持未设置,因此所有其他半字节都与 0 进行 ORed)

【讨论】:

  • “已清除”是常用术语,而不是“已删除”。删除意味着它们不再是寄存器的一部分,而不是它们仍然存在并设置为零。
【解决方案2】:
  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
    

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      了解这些操作的最佳方法是逐步了解它们。我会尽力解释这个过程。在每一步中,我都将包含两个寄存器的状态,以便您继续跟进。为了保持 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

      异或斧头,斧头;清除 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

      你有它!现在您已经熟悉了班次操作,我将把最后一部分留给您。

      干杯!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多