0x40106e <main+30>: mov $0x0,%edx
0x401073 <main+35>: mov $0x0,%ecx
0x401078 <main+40>: cmp $0x9,%ecx
0x40107b <main+43>: jle 0x40107f <main+47>
0x40107d <main+45>: jmp 0x401084 <main+52>
0x40107f <main+47>: add %ecx,%edx
0x401081 <main+49>: inc %ecx
0x401082 <main+50>: jmp 0x401078 <main+40>
0x401084 <main+52>: // endpoint
寄存器ecx&amp;的值edx会吗?有人可以帮助我完成这个程序。 另外,我如何在ideone.com上运行它
答案 0 :(得分:0)
如果您对此不熟悉,则应使用人类可读的语言对每行进行注释。此外,不要羞于更改标签以使事情更容易理解。
就我而言,我发现很明显<main+40>
是循环条件而<main+47>
是循环体。我认为这是一个循环,因为代码跳回(只跳转的代码不能循环)。由于<main+40>
测试ecx
并相应地跳转,我猜测这是评估循环条件的地方。这使<main+47>
成为循环体。
mov $0x0,%edx ; %edx = 0
mov $0x0,%ecx ; %ecx = 0
loop_test: cmp $0x9,%ecx ; compare %ecx to 9 (see jumps below)
jle loop_body ; jump to loop_body if %ecx <= 9
jmp endpoint ; jump to endpoint otherwise
loop_body: add %ecx,%edx ; %edx += %ecx
inc %ecx ; %ecx++
jmp loop_test ; return to comparison
endpoint: ; endpoint
然后您可以编写执行相同操作的C代码:
int ecx = 0;
int edx = 0;
loop_test:
if (ecx <= 9)
{
goto loop_body;
}
goto endpoint;
loop_body:
edx += ecx;
ecx++;
goto loop_test;
endpoint:
return;
精明的读者会注意到这与for循环有着奇怪的相似之处。
int total = 0;
for (int i = 0; i < 10; i++)
{
total += i;
}
如果您不了解某条指令,则应look it up(免责声明:我是该资源的维护者)。