【问题标题】:Exponentiation function intel assembly指数函数英特尔汇编
【发布时间】:2012-09-19 04:43:20
【问题描述】:

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

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

组装错了吗?他们?两者都有?

【问题讨论】:

  • 我建议你使用橡皮鸭调试,并用你认为它在做什么来评论每一行汇编。
  • imul ecx, ecx 将用相乘的结果覆盖原始值。循环的第二次迭代将计算 (y * y) * (y * y) 而不是 (y * y) * y,依此类推。
  • 您编写的不是幂函数a tetration function,它与Knuth's double-arrow function 相同。这是有效的代码,仅用于不同的目的。
  • 你计算的是 x^(2^y)。

标签: assembly bison yacc exponentiation


【解决方案1】:

(Comments converted to an Answer)

@DCoder 写道:

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

@nrz 写道:

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

@hirschhornsalz 写道:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-14
    • 2012-10-22
    • 1970-01-01
    • 2016-07-13
    • 2011-04-29
    • 2015-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多