작은 데모의 상세한 설명

1166 단어
<span style="font-size: 18px;">C      :</span>
int exchange(int *xp, int y)
{
	int x = *xp;
        *xp = y;
	return x;
}

오늘은 주로 mov의 지령을 봤기 때문에 프로그램 내의 두 변수로 전환된 조작에 따라 어셈블리 언어에 비치는 상황을 이야기합니다...오늘 막 편집물에 발을 들여놓으면 언제든지 물에 빠져 죽을 것 같은 느낌이 든다...(너무 추상적이어서 나무가 있다)
어셈블리 코드는 다음과 같다.
xp at %ebp + 8
y  at %ebp + 12
이것은 어셈블리 코드 안의 두 주석이다. 즉, xp와 y라는 두 변수는 각각 이 두 메모리 주소에 존재한다는 뜻이다. 사실 이 두 변수가 주소 찾기 형식으로 바뀌면 8(%ebp)12(%ebp)로 바뀌어야 한다. 이 두 내용은%ebp+8,%ebp+12와 똑같아야 한다.모두 두 변수의 주소이다
movl  8(%ebp),    %edx
movl    (%edx) ,   %eax
movl  12(%ebp),   %ecx
movl   %ecx. 		(%edx)  

처음에는 사실 잘 이해하지 못했는데 주로 (%ebp)라는 것을 몰랐기 때문에 나중에 책을 뒤져서 알게 되었다. 이것은 주소 찾기 조작을 의미하고 값이 ebp 레지스터에 저장된 값의 메모리 주소를 찾는 것이다.
첫 번째 명령은 xp를%edx라는 레지스터에 주었다는 것입니다. 그러나 이 때의 xp의 값은 주소입니다.
두 번째 명령은 M[%edx]->%eax 같은 조작을 실행하여 *xp를%eax에게 전송합니다
세 번째 지령은 첫 번째 지령과 같아서 y의 값을ecx라는 레지스터에 전송한다
네 번째 지령도 y의 값을 x값이 있는 메모리 영역에 전송하고 x의 값을 덮어쓰는 것을 잘 알고 있다.
어쨌든 어셈블리가 쉽지 않아요. 제가 닦을게요. 바로 제가 이 블로그를 쓸 때 몇 번이나 빙빙 돌면서 기절했어요...CSAPP, 이 책은 정말 보기 힘들다.

좋은 웹페이지 즐겨찾기