2012-09-19 97 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)。