전체 : 4,150,784 명
어제 : 0 명
오늘 : 0 명

어셈블리로 swap 함수!

룰루라라라 | 2010.07.17 05:58 | 조회 9033

일반적으로 c나 c ++을 이용해

call by reference 로 만든 swap 함수를 작성하면

void swap(int *a,int*b)

{

int temp=*a;

*a=*b;

*b=temp;

}

로 만들수가 있죠.

이걸 어셈블리어 로 고쳐보면 처음 셋팅 부분과 마지막 세팅 부분을 빼면 중간부분은

movl 12(%ebp),%eax

movl 8(%ebp),%ecx

movl (%eax),%edx

movl (%ecx),%ebx

movl %ebx,(%eax)

movl %edx,(%ecx)

(일반적으로 첫번째 매개변수는 ebp+8 의 주소에 , 두번째 매개변수는 ebp+12 의 주소에 들어있습니다.)

가 됩니다. 이게 일반적인 방법 이죠 .

여기서 문제는 일반적 용도로 사용되는 레지스터 %eax,%ecx,%edx 이 세개만을 가지고서 swap 함수를 6줄로 만들수가 있을까요???

메모리-> 메모리 간의 이동은 불가하기때문에 복잡하게 생각하면 어려워보입니다.

그런데 swap 함수 를 1줄로 만드는 c 코드가 c/c++강좌에 찾아보시면

x=x^y=y^x=x^y

라는 코드가 있습니다. 왜 swap 이 되는지도 친절히 나와있구요 이걸 이용하면

movl 12(%ebp),%eax

movl 8(%ebp),%ecx

movl (%eax),%edx

xorl (%ecx),%edx

xorl %edx,(%eax)

xorl %edx,(%ecx)

로 %ebx 를 사용하지않고 세개의 레지스터 만으로도 swap 함수를 작성 할수 있습니다.

자 3개의 레지스터를 사용해서 swap 함수를 만들어보았습니다. 그럼 2개의 레지스터로 는 못할까요?

할수있습니다! , push, 와 pop 을 이용한 간단한 방법이지요.

우선 소스를 보면

movl 12(%ebp),%eax

movl 8(%ebp),%ecx

pushl (%eax)

pushl (%ecx)

popl (%eax)

popl (%ecx)

가 되는데. 처음 push (%eax) 를 하면 스택에 %eax 에 저장된 주소가 가리키는 값이 저장되고 두번째 push 에서는 %ecx 가 가리키는 값이 저장됩니다. 그럼 스택의 탑에는 %ecx 에 값이 있으므로

pop 을 이용해서 %eax,%ecx 에 담아내는 겁니다.

swap 함수를 5줄로도 줄일수 있는데요, cpu 에 따라서 xchg 인스터럭션을 지원하는게 있다더군요( 요즘것들은 거의 다 됩니다)

xchg 는 두개의 레지스터 내용을 바꿔주는 겁니다 (swap 을 해주는거죠..) 그걸 이용하면

movl 12(%ebp),%eax

movl 8(%ebp),%ecx

movl (%eax),%edx

xchgl %edx,(%ecx)

movl %edx,(%eax)

가 됩니다..

학교과제를 하면서 레포트 제출용으로 썼던 내용 들입니다..

혹시 저방법이나 add,sub 혹은 mul,div 말고 다른방법이나 mov 만을 이용해 레지스터 3개로 6줄 만드는 방법이 있을까 하면 질답 게시판에 질문을 올렷지만... 아무도 답변이 없으시더군요 ㅠㅠ 그래서 제가 아는 방법 들을 모아서 올려봅니다 ~

극도의 상황에서 레지스터 사용갯수를 줄여야 하거나 그럴 상황이 잇을때 필요할거같더군요, 일반적으로 첫번재 방법을 사용해도 좋지만, 뭐 생각을 조금씩 바꾸면 여러가지 방법이 많다는 것을 알려드리기 위해 작성한 글입니다~

조금 두서없고 그렇지만 좋게 봐주세요~

twitter facebook me2day 요즘
일반적으로 첫번째 매개변수는 ebp+8에 있고 두번째 매개변수는 ebp+..
일반적으로 첫번째 매개변수는 ebp+8에 있고 두번째 매개변수는 ebp+12에 있다고 하셨는데

말씀하신대로 하면

movl 12(%ebp), eax 이부분이 그러면 *b 부분을 이야기하고
movl 8(%ebp), ecx 이 부분이 *a를 의미하는데
movl (%eax), %edx 하면 int temp = *b; 이렇게 코드가 바뀌어야하는거 아닌가요 ??
04.17 23:06 | whitemind님 | 신고 | 수정 | 삭제
댓글 0
입력상자 늘리기
잘보고 갑니다.
잘보고 갑니다.
07.22 00:33 | paranto님 | 신고 | 수정 | 삭제
댓글 0
입력상자 늘리기
아핫; 지적 감사합니다 이제 봣네요; 내 그게 맞아요 ㅎ 근데 그냥 sw..
아핫; 지적 감사합니다 이제 봣네요; 내 그게 맞아요 ㅎ 근데 그냥 swap 을 한다는 점에서 저렇게 써둿네요 ㅠ 죄송합니다 ㅠ
08.01 01:10 | 룰루라라라님 | 신고 | 수정 | 삭제
댓글 0
입력상자 늘리기
잘 보구 갑니다^^

잘 보구 갑니다^^

12.15 00:04 | 겨울섬님 | 신고 | 수정 | 삭제
댓글 0
입력상자 늘리기
감사하옵나이다

감사하옵나이다

12.16 12:53 | 미리내v님 | 신고 | 수정 | 삭제
댓글 0
입력상자 늘리기
감사 합니다.

감사 합니다.

02.06 11:22 | hanassi님 | 신고 | 수정 | 삭제
댓글 0
입력상자 늘리기
감사합니다
감사합니다
05.30 13:45 | mikijongs님 | 신고 | 수정 | 삭제
댓글 0
입력상자 늘리기
잘 봤습니다
잘 봤습니다
02.27 11:18 | 린찬님 | 신고 | 수정 | 삭제
댓글 0
입력상자 늘리기
댓글쓰기 - 로그인한 후 댓글작성권한이 있을 경우 이용하실 수 있습니다.

비밀번호 확인

댓글 등록시에 입력했던 비밀번호를 입력해 주세요.
26개(1/2페이지)
rss
어셈블리언어
번호 제목 작성자 작성일 조회
26 push 명령어 tip[2] 휘바골드 2013.02.22 1420
25 비베이용 강좌 2 kane0202 2012.12.23 2017
24 비베 6.0 기초강좌[2] kane0202 2012.12.23 2247
23 Carry VS Overflow Flag 개념 잡기.[10] 마플 2012.06.02 8932
22 [기초]간과하기 쉬운 것들...[27] 쿨러 2011.10.13 8372
21 [중급]어셈블리어의 CPU레지스터[17] 오타해커 2011.08.18 9306
20 [고급]ReaD Time Stamp Counter (RDTSC) 명령어[2] Sone 2010.02.03 9917
19 [고급]PC ASM첨부파일[25] 디코 2009.12.23 9095
>> [기초]어셈블리로 swap 함수![8] 룰루라라라 2010.07.17 9034
17 [기초]김병희님 강좌입니다.첨부파일[101] 공돌이pooh 2010.02.14 10822
16 [기초]LEA 명령어 강좌[9] 우준 2010.01.17 10163
15 [기초][PDF] 어셈블리어의 기초.첨부파일[81] 프로그래밍 2009.06.02 18201
14 [기초]8051 어셈블리언어[18] Mrsa 2009.04.02 7574
13 [기초]ASM 강좌첨부파일[61] Нyan™ 2008.04.21 9796
12 [기초]Pop 문 정리[12] EROS 2008.04.01 7861
11 [기초]Mov 문 정리[14] EROS 2008.04.01 7344
10 [기초]Call 문 정리[18] EROS 2008.04.01 8285
9 [기초]CMP 문 정리[16] EROS 2008.04.01 8304
8 [기초]Jxx 명령어 종합[26] EROS 2008.04.01 8813
7 [기초]8051 어셈블리언어 해석[2][26] Mrsa 2007.12.10 7630
처음페이지이전 10 페이지12다음 10 페이지마지막페이지