Assembly 最多写入两条指令以清除、设置和补充AL寄存器中的某些位

Assembly 最多写入两条指令以清除、设置和补充AL寄存器中的某些位,assembly,x86,xor,masm,Assembly,X86,Xor,Masm,您需要在汇编中最多编写两条指令才能执行以下操作: 清除寄存器AL的位0和7,即使其为0 设置寄存器AL的第3位和第4位,即将它们设为1 对寄存器AL的第1位和第5位进行补码 保持寄存器AL中的所有其他位不变,而不改变其值 一条DB指令定义256个“结果”值的数组,一条move指令使用al中的当前值作为索引,将该数组的元素移动到al中 那不管用吗 甚至有人可能会说,这实际上甚至是一个单指令解决方案,因为DB实际上不是一条在运行时执行的指令,而是一条编译时声明性指令。这里的技巧是执行以下操作: 使用

您需要在汇编中最多编写两条指令才能执行以下操作:

  • 清除寄存器AL的位0和7,即使其为0
  • 设置寄存器AL的第3位和第4位,即将它们设为1
  • 对寄存器AL的第1位和第5位进行补码
  • 保持寄存器AL中的所有其他位不变,而不改变其值

  • 一条DB指令定义256个“结果”值的数组,一条move指令使用al中的当前值作为索引,将该数组的元素移动到al中

    那不管用吗


    甚至有人可能会说,这实际上甚至是一个单指令解决方案,因为DB实际上不是一条在运行时执行的指令,而是一条编译时声明性指令。

    这里的技巧是执行以下操作:

  • 使用OR指令设置位0、3、4和7

  • 使用异或指令对位0、1、5和7进行补码

  • 请注意,位0和7首先在(1)中设置,然后在(2)中清除


    我将把实际的asm说明留给您,因为这毕竟是您的家庭作业。

    三种说明解决方案:
    al->al&0b01111110 | 0b00011000^0b00100010
    。最难的部分是把它简化为两个说明。这是一个额外的问题。我不必给出答案,但我一直在思考解决方案,我仍然在想谢谢你,保罗先生。这应该是代码:OR AL,10011001 XOR AL,10100011@Nick:是的,这看起来是正确的,具体取决于您使用的CPU和汇编程序。另一种方法是清除位0、3、4、7,然后补充位1、3、4、5。他提出了一个查找表,其中256个可能的输入值中的每一个都有一个结果值。该列表是使用DB命令创建的。使用简单的
    move AL,start+index
    指令执行查找。