使用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");
}
装配错了吗?他们?既?
答案 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)。