Assembly 组装32位左移位器

Assembly 组装32位左移位器,assembly,x86,masm,irvine32,Assembly,X86,Masm,Irvine32,我在让这个名为DoLeftShift的程序正常工作时遇到了一些问题。换档程序正在工作,我知道,因为我有测试值,它们都工作,所以问题出在DoLeftShift 对于禁用的移位器,我得到所有0或所有1,其中它应该是最初放入的相同二进制文件。启用换档和换档指令也不起作用 编辑:代码已删除,因为它是家庭作业的一部分 调用移位器过程时,启用/禁用设置得很好(来自$parm2) 但是,当您从loopTop循环中重复调用移位器过程时,ECX寄存器不再保存正确的信息 移位器过程从不保留任何寄存器,因此CL寄存器

我在让这个名为DoLeftShift的程序正常工作时遇到了一些问题。换档程序正在工作,我知道,因为我有测试值,它们都工作,所以问题出在DoLeftShift

对于禁用的移位器,我得到所有0或所有1,其中它应该是最初放入的相同二进制文件。启用换档和换档指令也不起作用

编辑:代码已删除,因为它是家庭作业的一部分

调用移位器过程时,启用/禁用设置得很好(来自$parm2)

但是,当您从loopTop循环中重复调用移位器过程时,
ECX
寄存器不再保存正确的信息

移位器过程从不保留任何寄存器,因此
CL
寄存器以切换状态返回(
xor CL,1;CL=NOT CL

解决方案:
  • 每次调用移位器之前,从$parm2重新加载
    ECX
  • 最好在换档杆程序结束时反转
    CL
  • 保留所有不返回值的寄存器

第三个(也是最好的IMHO)选项:在移位器程序开始时将bl和cl推到堆栈上,并在返回之前将它们弹出。@Jeremy:那将是选项3。@RudyVelthuis选项3是在我发布我的评论后添加到答案中的,可能是因为我发布了我的评论。@JeremyP:很有可能。所以你可以删除评论。非常感谢,就这样。我以前没有在Shifter过程中按下和弹出ebx和ecx。不要删除代码来破坏你的问题。它删除了答案的上下文。(如果您出于某种原因需要删除部分/全部代码,至少在编辑消息中这样说,否则人们只会将其回滚。)
mov ecx, $parm2         ;ecx = enable/disable bit
call Shifter            ;call Shifter procedure