清除、设置和取反AL寄存器中的一些位的最多指令数为两条。

8

您需要编写最多两条汇编指令来完成以下操作:

  1. 清除寄存器AL中的第0位和第7位,即将它们设为0
  2. 设置寄存器AL中的第3位和第4位,即将它们设为1。
  3. 对寄存器AL中的第1位和第5位进行补码运算。
  4. 保留寄存器AL中所有其他位的值,不改变它们的值。

3
“三条”指令的解决方案是:al -> al & 0b01111110 | 0b00011000 ^ 0b00100010。难点在于将其简化为两条指令。 - kennytm
2
这是一个奖励问题。我不必回答,但我一直在思考解决方案,而且仍在继续思考。 - Nick
2个回答

10
在这里的技巧是:
  1. 使用 OR 指令来 设定 0、3、4 和 7 号位

  2. 使用 XOR 指令来 翻转 0、1、5 和 7 号位

注意,在步骤 (1) 中,0 和 7 号位首先被设定,然后在步骤 (2) 中被清除。

由于这是你的家庭作业,我会留下真正的汇编指令给你完成。


2
谢谢Paul先生。这应该是代码:OR AL,10011001 XOR AL,10100011 - Nick
@Nick:是的,看起来差不多正确。具体取决于你使用的CPU和汇编器。 - Paul R
1
另一种方法是清除位0、3、4、7,然后补充位1、3、4、5。Clang可以进行此优化 - phuclv

4
一个DB指令定义了一个包含256个“result”值的数组,再加上一个move指令将该数组的一个元素移动到al寄存器中,使用al寄存器当前的值作为索引。这样做可行吗?
甚至可以认为这实际上是一种单指令解决方案,因为DB不是在运行时执行的指令,而是编译时声明的。

他提出了一个查找表,为256个可能的输入值中的每一个结果值。该列表是使用DB命令创建的。查找是使用简单的“move AL,start + index”指令执行的。 - mafu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接