x86汇编中SHL eax, ecx指令触发A2070错误的问题咨询
解决x86汇编中
shl eax, ecx的A2070指令操作数错误 你碰到的A2070: invalid instruction operands错误其实是x86指令集的硬性限制导致的——移位指令(包括shl、shr、sal、sar等)并不支持用32位寄存器ecx作为移位计数操作数,哪怕你的ecx值很小(不超过5)也不行。
为什么会这样?
在x86架构的指令设计里,移位指令的计数操作数只能是以下两种形式之一:
- 一个8位的立即数(比如你测试的
shl eax, 5,这完全符合规范,所以能正常编译) - 或者8位寄存器
cl(注意是ecx的低8位部分,不是完整的32位ecx寄存器)
因为你的ecx值始终在1-5之间(循环逐次减1),cl寄存器的内容和ecx的有效数值是完全一致的,所以直接用cl替代ecx就能解决问题。
修改后的代码
把multiply过程里的错误行替换成:
multiply PROC shl eax, cl ; 用cl替代ecx,符合x86指令集要求 push eax multiply endp
额外小提醒
顺便看了下你的代码逻辑,createArray里调用multiply后执行pop eax,这个是为了取出multiply里push eax的结果对吧?这个逻辑是通顺的,但要确保整个过程中寄存器的栈操作是平衡的,避免栈溢出或者数据混乱。
内容的提问来源于stack exchange,提问作者Collin Hurst
相关产品推荐
相关产品推荐

