2012-09-19 2 views
0

간단한 계산기에 대한 어셈블리 코드를 생성하는 들소를 사용하여,하지만 난 내 버그, 모든 해답은 하나의 곱셈 오프 것 같다 여기 정확히 알아낼 수 없습니다 ...지수화 기능 인텔 어셈블리

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 

exp '^' exp  { $$ = pow ($1, $3); 
      printf("call\tintpow\n"); 
      printf("push\tDWORD eax\n"); 
} 

어셈블리가 잘못 : 나는 지수 호출을 식별 할 때

여기에 코드를 내 .Y 파일에 있어요? .y? 양자 모두?

+0

고무 오리 디버깅을 사용하고 각 어셈블리 라인에 대해 사용자가 생각하는대로 주석을 달 것을 제안합니다. –

+3

'imul ecx, ecx'는 원래 값을 곱한 결과로 덮어 씁니다. 루프의 두 번째 반복은'(y * y) * y' 대신'(y * y) * (y * y)'를 계산합니다. – DCoder

+0

파워 기능 대신 [tetration function] (http://en.wikipedia.org/wiki/Tetration)을 작성했습니다. [Knuth의 이중 화살표 기능] (http : //en.wikipedia와 동일합니다. .org/wiki/Knuth's_up-arrow_notation). 다른 목적으로 만 유효한 코드입니다. – nrz

답변

1

(Comments converted to an Answer)

@DCoder 쓴 :

imul ecx, ecx를 곱한 결과와 원래의 값을 덮어 쓰기한다. 루프의 두 번째 반복은 (y * y) * y 대신 (y * y) * (y * y)을 계산합니다.

@nrz 작성 : 당신은 크 누스의 이중 화살표 기능과 같은 인 테트 레이션 기능을 작성한 전원 기능의

nstead. 다른 목적으로 만 유효한 코드입니다.

@hirschhornsalz 썼다 :

당신이 계산하는 것은 X^(^ Y 2)입니다.