【发布时间】: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