Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 装配无限循环_Assembly_X86_Gnu Assembler - Fatal编程技术网

Assembly 装配无限循环

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?尝试注释“完成”任

我关于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?尝试注释“完成”任务。

没有调试器吗?您的东西是否修改了%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
。注意,这也适用于您的函数。