Assembly 使用左移位(shl)得到2^N,给定N?

Assembly 使用左移位(shl)得到2^N,给定N?,assembly,x86,multiplication,bit-shift,Assembly,X86,Multiplication,Bit Shift,尝试使用左移位指令进行乘法 SHL shift left指令对目标操作数执行逻辑左移位,用0填充最低位 我不明白如何对N使用寄存器或内存,因为当我尝试这样做时,我被告知指令操作数无效 用户在RequestNumber过程中输入一个数字N,该过程返回EAX。 我尝试的计算是:result=1*2^N 我的代码: 我正在处理的作业请求使用Shift获取结果=2^N 就我所见,您只能在这个寄存器中使用imm8数字。使用较低的ECX尝试使用相同的结果 问题: 如果必须从用户处获取N,如何正确使用移位指令

尝试使用左移位指令进行乘法

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

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

用户在RequestNumber过程中输入一个数字N,该过程返回EAX。 我尝试的计算是:result=1*2^N 我的代码:

我正在处理的作业请求使用Shift获取结果=2^N 就我所见,您只能在这个寄存器中使用imm8数字。使用较低的ECX尝试使用相同的结果

问题:
如果必须从用户处获取N,如何正确使用移位指令?

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

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

移位量必须以cl为单位。因此,要从用户处获取移位输入,请将其置于cl中。回想一下,cl是ecx的低8位,因此,如果您将移位量置于ecx中,然后按cl移位,则其工作正常:

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

非常感谢。我想我正在努力理解如何将一个值从一个更大的EAX移动到一个更小的CLregister@urmur我理解。对于记录,技巧是从源的相应较小寄存器移动到目标。例如,要从eax移动到cl,请执行mov cl,al。或者,执行mov ecx,eax或movzx ecx,al。使用哪一个取决于您希望目标的高位发生什么。请注意,还有另一种方法可以实现1谢谢。我想我正在努力理解如何将一个值从一个更大的EAX移动到一个更小的CLregister@urmur我理解。对于记录,技巧是从源的相应较小寄存器移动到目标。例如,要从eax移动到cl,请执行mov cl,al。或者,执行mov ecx,eax或movzx ecx,al。使用哪一种取决于您希望目标高位发生什么。请注意,还有另一种实现1的方法,如果使用cl进行移位计数确实不方便,并且您的CPU具有BMI2指令,则可以使用。更大的代码大小,虽然是5字节而不是2字节。如果使用cl进行移位计数确实不方便,并且您的CPU有BMI2指令,您可以使用。虽然代码大小为5字节,但比2字节大。