어셈블러 코딩중

2
points

어셈블러로 코딩중인데

return fib(n-1) + fib(n-2)

이부분을 어떻게 처리해야할지 모르겠네요...

whitelazy의 이미지
3484
points

fib(n-1) 계산해서

1
point

fib(n-1) 계산해서 짱박고
fib(n-2) 계산해서 짱박고
두개 더해서 짱박고
리턴해버리면되죠...??

질문이 너무 간단해서 이게 맞나 ;;

임수서룬뫼의 이미지
37537
points

--n;t = fib(n);--n;return t

1
point

--n;
t = fib(n);
--n;
return t + fib(n);

dec N_REG
push 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

feanor의 이미지
9674
points

gcc -S

1
point

gcc -S 해서 출력을 읽어보시면 됩니다.

어셈블리어는 가장 쉽게 생각하면 됩니다.

2
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

감사합니다. 그런데...

1
point

pop ebx
add eax, ebx
이 부분에서 ebx에는 어떤 값이 있는건지..

mov eax, N_MEM dec eax push

2
points

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

명령어 중에 따로

1
point

명령어 중에 따로 ebx에 어떤 값을 넣으라는 구문이 없는데도
ebx에 값이 저장될 수 있는 것입니까?
아니면 eax에 어떤 값이 저장되어 있는데 거기에 또 어떤 값을 넣는다면
자동적으로 ebx에 들어가는 건지 궁금합니다^^

whitelazy의 이미지
3484
points

dec eax

0
points

김동수님의 예제를 빌리자면

김동수 씀:

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

cpu는 그렇게 친절하지 않습니다 :-)

댓글 보기 옵션

원하시는 댓글 전시 방법을 선택한 다음 "설정 저장"을 누르셔서 적용하십시오.