Assembly 装配无限循环
我关于x86汇编的传奇还在继续,这段代码让我陷入了无限循环,我有点困惑Assembly 装配无限循环,assembly,x86,gnu-assembler,Assembly,X86,Gnu Assembler,我关于x86汇编的传奇还在继续,这段代码让我陷入了无限循环,我有点困惑 movl $1, %ecx movl $4, %edi do_loop: cmpl %edi, %ecx je do_exit ......... do_stuff ......... incl %ecx jmp do_loop do_exit: 当%ecx达到4时,我希望跳转到do_exit:,因为它在每次迭代中都会递增没有调试器?您的东西是否修改了%edi?尝试注释“完成”任
movl $1, %ecx
movl $4, %edi
do_loop:
cmpl %edi, %ecx
je do_exit
.........
do_stuff
.........
incl %ecx
jmp do_loop
do_exit:
当%ecx达到4时,我希望跳转到do_exit:,因为它在每次迭代中都会递增没有调试器?您的东西是否修改了%edi?尝试注释“完成”任务。没有调试器吗?您的东西是否修改了%edi?试着注释do_stuff out。我不知道do_出口后面是否有空格,我不知道您是如何执行汇编代码的 但请尝试在do_退出后添加以下内容: 离开 ret
我不知道do_出口后面是否有空格,我也不知道您是如何执行汇编代码的 但请尝试在do_退出后添加以下内容: 离开 ret
正如其他人提到的,在
do\u stuff
中使用寄存器时要小心。而你真正想要的是,尤其是这一行:
寄存器EAX、ECX和EDX可在函数中使用。正如其他人所提到的,在
do\u stuff
中使用寄存器时要小心。而你真正想要的是,尤其是这一行:
寄存器EAX、ECX和EDX可在函数中使用。有人告诉我,您正在重复使用/重新分配do_stuff部分中的ECX…do_stuff对printf进行了一些调用,显然它修改了寄存器。我没料到。有东西告诉我你在你的do_stuff部分重用/重新分配ecx…do_stuff调用printf,显然它修改了寄存器。我没想到,我只是打电话给printf。调用前在堆栈上保存ecx和edi,调用后弹出它们似乎可以给出正确的结果。奇怪,我没想到会这样。@void:调用约定允许被调用函数修改
ecx
,以及eax
和edx
。其余的必须保留。因此,您不必在调用printf
时保存edi
。注意,这也适用于你的函数。我只是调用printf。调用前在堆栈上保存ecx和edi,调用后弹出它们似乎可以给出正确的结果。奇怪,我没想到会这样。@void:调用约定允许被调用函数修改ecx
,以及eax
和edx
。其余的必须保留。因此,您不必在调用printf
时保存edi
。注意,这也适用于您的函数。