0

使用野牛为一个简单的计算器生成汇编代码,但我无法弄清楚我的错误到底是什么,所有的答案似乎都是一个乘法......

global intpow
intpow:
    push    ebp
    mov     ebp,esp
    mov     ecx,[ebp+8]
    mov     eax,[ebp+12]

loop:
    cmp     eax,1
    jle     finish
    dec     eax
    imul    ecx,ecx
    jmp     loop

finish:
    mov     eax,ecx
    mov     esp,ebp
    pop     ebp
    ret

当我识别指数调用时,这是我的 .y 文件中的代码:

exp '^' exp        { $$ = pow ($1, $3);
          printf("call\tintpow\n");
          printf("push\tDWORD eax\n");
}

组装错了吗?他们?两个都?

4

1 回答 1

1

评论转换为答案

@DCoder 写道:

imul ecx, ecx将用相乘的结果覆盖原始值。循环的第二次迭代将计算(y * y) * (y * y)而不是(y * y) * y,依此类推。

@nrz 写道:

您编写的不是幂函数而是四分函数,它与 Knuth 的双箭头函数相同。这是有效的代码,仅用于不同的目的。

@hirschhornsalz 写道:

您正在计算的是 x^(2^y)。

于 2015-02-13T17:03:37.687 回答