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? 양자 모두?
고무 오리 디버깅을 사용하고 각 어셈블리 라인에 대해 사용자가 생각하는대로 주석을 달 것을 제안합니다. –
'imul ecx, ecx'는 원래 값을 곱한 결과로 덮어 씁니다. 루프의 두 번째 반복은'(y * y) * y' 대신'(y * y) * (y * y)'를 계산합니다. – DCoder
파워 기능 대신 [tetration function] (http://en.wikipedia.org/wiki/Tetration)을 작성했습니다. [Knuth의 이중 화살표 기능] (http : //en.wikipedia와 동일합니다. .org/wiki/Knuth's_up-arrow_notation). 다른 목적으로 만 유효한 코드입니다. – nrz