指数函数intel汇编

时间:2012-09-19 04:43:20

标签: assembly bison yacc exponentiation

使用bison为一个简单的计算器生成汇编代码,但我无法确切地知道我的bug在这里,所有的答案似乎都是一个乘法...

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");
}

装配错了吗?他们?既?

1 个答案:

答案 0 :(得分:1)

Comments converted to an Answer

@DCoder写道:

  

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

@nrz写道:

  

无论您使用功能函数编写了一个tetration函数,它与Knuth的双箭头函数相同。它是有效的代码,仅用于不同的目的。

@hirschhornsalz写道:

  

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