汇编代码:如果此代码从其开始运行直到端点

时间:2014-07-27 20:19:48

标签: assembly

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上运行它

1 个答案:

答案 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(免责声明:我是该资源的维护者)。