使用 Shift-Left (shl) 得到 2^N,给定 N?

问题描述

尝试使用 Shift-Left 指令进行乘法运算。

SHL(左移)指令对目标操作数执行逻辑左移,用 0 填充最低位。

SHL instruction

我不明白如何为 N 使用寄存器或内存,因为当我尝试这样做时,我被告知“指令操作数无效”

  1. 用户在 RequestNumber 过程中输入数字 N(返回 EAX)。
  2. 我尝试的计算是:result = 1 * 2^N

我的代码

mov ebx,1   
call RequestNumber      ; returns eax   
shl ebx,eax   
mov result,ebx

我正在处理的作业要求使用 Shift 来获取结果 = 2^N 据我所知,您只能在此寄存器 CL 中使用 imm8 数字(尝试使用较低的 ECX,结果相同)。

Operand types for SHL

问题: 如果必须从用户那里获取 N,我该如何正确使用 Shift 指令?

解决方法

偏移量必须在 cl 中。因此,要从用户那里获得移位输入,请将其放置在 cl 中。回想一下,clecx 的低 8 位,因此如果您将移位量放在 ecx 中,然后移位 cl,它会按预期工作:

mov ebx,1   
call RequestNumber      ; returns eax
mov ecx,eax
shl ebx,cl
mov result,ebx