어셈블러로 코딩중인데
return fib(n-1) + fib(n-2)
이부분을 어떻게 처리해야할지 모르겠네요...
fib(n-1) 계산해서 짱박고 fib(n-2) 계산해서 짱박고 두개 더해서 짱박고 리턴해버리면되죠...??
질문이 너무 간단해서 이게 맞나 ;;
--n;t = fib(n);--n;return t + fib(n);
dec N_REGpush N_REGcall fibpush RETURN_REGdec N_REGpush N_REGcall fibpop TEMP_REGadd RETURN_REG, TEMP_REGret
이렇게 되지 않을까요? (헷갈린다...)
gcc -S 해서 출력을 읽어보시면 됩니다.
가장 쉽게 생각하면 됩니다. 가장 간단한 언어니까요.
위 코드를 정리하면
return ((fib(n-1))+(fib(n-2)))
IA32 기준으로 대충 정리하면
mov eax, N_MEM dec eax push eax call fib push eax mov eax, N_MEM; sub eax, 2 push eax call fib pop ebx add eax, ebx retn
뭐 이런 괴악한 코드로 짤 수도 있긴 하죠. sub esp, 4 push N_MEM push N_MEM sub dword ptr ss:[esp], 1 sub dword ptr ss:[esp+4], 2 call fib mov dword ptr ss:[esp+4], eax call fib add eax, dword ptr ss:[esp] retn 4
------------------------------------- 김동수 - PublicEnemy
pop ebx add eax, ebx 이 부분에서 ebx에는 어떤 값이 있는건지..
처음 fib를 부르고 나온 결과값. 즉 fib(n-1) 의 값을 스택에 넣어 둔 후, 마지막에 꺼내서 연산합니다. 함수를 call 하면 결과값은 ia32의 경우 eax에 저장되는게 일반적입니다.
명령어 중에 따로 ebx에 어떤 값을 넣으라는 구문이 없는데도 ebx에 값이 저장될 수 있는 것입니까? 아니면 eax에 어떤 값이 저장되어 있는데 거기에 또 어떤 값을 넣는다면 자동적으로 ebx에 들어가는 건지 궁금합니다^^
김동수님의 예제를 빌리자면
cpu는 그렇게 친절하지 않습니다 :-)
points
fib(n-1) 계산해서
fib(n-1) 계산해서 짱박고
fib(n-2) 계산해서 짱박고
두개 더해서 짱박고
리턴해버리면되죠...??
질문이 너무 간단해서 이게 맞나 ;;
points
--n;t = fib(n);--n;return t
--n;t = fib(n);
--n;
return t + fib(n);
dec N_REGpush N_REG
call fib
push RETURN_REG
dec N_REG
push N_REG
call fib
pop TEMP_REG
add RETURN_REG, TEMP_REG
ret
이렇게 되지 않을까요? (헷갈린다...)
한말글 프로그래밍 언어 "열정" http://me-lang.wo.tc
points
gcc -S
gcc -S 해서 출력을 읽어보시면 됩니다.
points
어셈블리어는 가장 쉽게 생각하면 됩니다.
가장 쉽게 생각하면 됩니다. 가장 간단한 언어니까요.
return fib(n-1) + fib(n-2)
위 코드를 정리하면
return ((fib(n-1))+(fib(n-2)))
IA32 기준으로 대충 정리하면
mov eax, N_MEM
dec eax
push eax
call fib
push eax
mov eax, N_MEM;
sub eax, 2
push eax
call fib
pop ebx
add eax, ebx
retn
뭐 이런 괴악한 코드로 짤 수도 있긴 하죠.
sub esp, 4
push N_MEM
push N_MEM
sub dword ptr ss:[esp], 1
sub dword ptr ss:[esp+4], 2
call fib
mov dword ptr ss:[esp+4], eax
call fib
add eax, dword ptr ss:[esp]
retn 4
-------------------------------------
김동수 - PublicEnemy
points
감사합니다. 그런데...
pop ebx
add eax, ebx
이 부분에서 ebx에는 어떤 값이 있는건지..
points
mov eax, N_MEM dec eax push
mov eax, N_MEM
dec eax
push eax
call fib
push eax
mov eax, N_MEM;
sub eax, 2
push eax
call fib
pop ebx
add eax, ebx
retn
처음 fib를 부르고 나온 결과값. 즉 fib(n-1) 의 값을 스택에 넣어 둔 후, 마지막에 꺼내서 연산합니다.
함수를 call 하면 결과값은 ia32의 경우 eax에 저장되는게 일반적입니다.
-------------------------------------
김동수 - PublicEnemy
points
명령어 중에 따로
명령어 중에 따로 ebx에 어떤 값을 넣으라는 구문이 없는데도
ebx에 값이 저장될 수 있는 것입니까?
아니면 eax에 어떤 값이 저장되어 있는데 거기에 또 어떤 값을 넣는다면
자동적으로 ebx에 들어가는 건지 궁금합니다^^
points
dec eax
김동수님의 예제를 빌리자면
cpu는 그렇게 친절하지 않습니다 :-)