2012-09-19 59 views
0

使用野牛生成一个简单的计算器汇编代码,但我想不出我的错误是在这里到底是什么,所有的答案似乎是一个乘法关闭...幂函数Intel汇编

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

我建议你使用橡皮鸭调试和评论每个组装行与你相信它正在做什么。 –

+3

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

+0

与[Knuth的双箭头函数](http://en.wikipedia)相同,您已经编写[功能函数](http://en.wikipedia.org/wiki/Tetration) .ORG /维基/ Knuth's_up-arrow_notation)。这是有效的代码,仅用于不同的目的。 – nrz

回答

1

Comments converted to an Answer

@DCoder写道:

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

@nrz写道:

你写一个迭代幂次函数,这是一样的Knuth的双箭头功能的幂函数的nstead。这是有效的代码,仅用于不同的目的。

@hirschhornsalz写道:

你所计算为x ^(2^Y)。