assembly - 如何在汇编中使用 ADD 而不是使用 SHL 左移?

标签 assembly x86 bit-shift

我们的老师在类里面给我们布置了一项作业。问题是我们在类里面没有讨论位移位,所以我有点不知道如何做到这一点。在作业说明中,他告诉我们以下内容:

  • 我们只能使用 mov、add 、sub 指令来完成赋值。
  • 他给了我们以下提示:思考一下如何使用add指令来实现移位。例如,假设我们有以下8位二进制数:00000011,将这个二进制数左移后得到。 00001100。

我们从 4 个变量开始:

  • var1 字节 41h
  • var2 字节 42h
  • var3 字节 43h
  • var4 字节 44h

作业的第一部分是移动它们,因此我们最终得到以下顺序:

  • var1 = 44h
  • var2 = 41h
  • var3 = 42h
  • var4 = 43h

我成功完成了这一部分,我只是提供了上下文。下一部分是我遇到问题的地方。在第二部分中,我们需要将这些变量移至寄存器 eax 中。 var1 必须存储在 eax 的最高字节中,var2 存储在第二高字节中,war3 存储在第二低字节中,var4 存储在最低字节中。

最终结果应为 eax = 444144243

所以这是我对这个问题的了解:

  • 我知道我不能直接引用 eax 的最高 16 位。
  • 我可以引用ax和al。
  • 我知道我需要使用这些十六进制值的二进制值,通过添加 1 或类似的值将它们向左移动。

我该如何移动 var1,使其最终与其他变量一起位于 eax 的高 16 位中?

注意:我没有代码,因为我不知道从哪里开始这部分作业。我不想解决它,我只是想帮助找到解决它的正确路径。

最佳答案

要将值向左移动,您需要将相同的值添加到自身

例如,如果您有 0011

0011 + 0011 = 0110 (shift 1 left)
0110 + 0110 = 1100 (shift 1 left again)

为了解决您的问题,我将采用以下方法(快速方法)

MOV ah, var1  (move 44h to 0000h -> 4400h)
MOV al, var2  (move 41h to 4400h -> 4441h)
ADD eax, eax    (4441h + 4441h = 8882h)
ADD eax, eax    (8882h + 8882h = 11104h)
ADD eax, eax    (11104h + 11104h = 22208h)
ADD eax, eax    (22208h + 22208h = 44410h)
ADD eax, eax    
ADD eax, eax    
ADD eax, eax   
ADD eax, eax    (444100h)
ADD eax, eax  
ADD eax, eax  
ADD eax, eax 
ADD eax, eax    (4441000h)
ADD eax, eax   
ADD eax, eax   
ADD eax, eax   
ADD eax, eax    (44410000h)

现在进入另一部分

MOV ah, var3  (move 42h to 44410000h -> 44414200h)
MOV al, var4  (move 43h to 44414200h -> 44414243h)

现在您的 eax 寄存器如下:4441 4243h

关于assembly - 如何在汇编中使用 ADD 而不是使用 SHL 左移?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58140691/

相关文章:

c - 我想知道,为什么执行后得到 "Attempt to execute non-instruction at 0x00400138"?

assembly - 在 MASM32 上包含语法

c++ - 组装的 C++ 似乎包含多余的指令

c - clang 试图优化这个简单的递归算法是什么?

c++ - C++中什么时候发生隐式类型转换?

PHP 无符号右移 - 故障

Eclipse错误: No source available for ""

c++ - ICC 中的 -O2 搞乱了汇编程序,ICC 中的 -O1 和 GCC/Clang 中的所有优化都很好

x86 - NASM x86 : send system call interpreting payload to send as NULL

C 编译器可以实现有符号右移 "unreasonably"吗?