티스토리 뷰

1. 데이터 전송 명령

1) mov

mov dest, src


-mov 명령은 src 오퍼랜드의 값을 desc 오퍼랜드로 이동

-이동한 후에도 src 오퍼랜드의 값은 사라지지 않기 때문에 복사라고도 할 수 있다.


2) lea

lea dest, src


-lea 명령은 src 오퍼랜드의 주소를 계산해 그 주소를 dest 오퍼랜드에 로드한다.

-주소를 계산한다는 것은 lea eax, [esp+0x40] 처럼 변위,오프셋 등을 포함한 주소를 계산한다는 말

-> 이 경우 스택 포인터가 가리키는 주소에서 변위 0x40을 더한 위치의 주소를 eax에 저장


3) xchg

xchg arg1, arg2


-xchg 명령은 arg1 오퍼랜드와 arg2 오퍼랜드의 값을 교환


4) push

push src


-push 명령은 arg 오퍼랜드의 값을 스택에 넣는다.

-ESP 레지스터의 값을 레지스터 폭만큼( 32비트에서는 4바이트, 64비트에서는 8바이트) 빼고 arg 오퍼랜드를 ESP 레지스터가 가리키는 스택의 상단에 저장


5) pop

pop dest


-pop 명령은 스택에서 arg 오퍼랜드로 값을 빼온다.

-ESP 레지스터가 가리키는 스택의 상단 값을 arg 오퍼랜드에 저장하고 ESP 레지스터의 값을 레지스터 폭만큼 더한다.




2. 연산 명령

1) add

add dest, src


-add 명령은 dest 오퍼랜드에 src 오퍼랜드를 더한 결과를 dest 오퍼랜드에 저장


2) sub

sub dest, src


-sub 명령은 dest 오퍼랜드에서 src 오퍼랜드를 뺀 결과를 dest 오퍼랜드에 저장


3) mul

mul


-mul 명령은 src 오퍼랜드에 EAX 레지스터 값을 곱하고 결과 주 상위 4바이트를 EDX 레지스터, 하위 4바이트를 EAX 레지스터에 저장


4) div

div src


-div 명령은 EDX:EAX 8바이트를 src 오퍼랜드의 값으로 나눠 몫은 EAX 레지스터, 나머지는 EDX 레지스터에 저장


5) inc , dec

inc dest

dec dest


-inc 명령과 dec 명령은 각각 dest 오퍼랜드의 갑슬 1만큼 증가,감소 시킨다.


6) cmp

cmp src1, src2


-cmp 명령은 sub 명령과 같이 뺄셈 연산을 하지만 결과는 오퍼랜드에 저장되지 않고 삭제됨

-이 명령의 목적은 플래그 레지스터의 값을 조건에 따라 변화시키는 것


7) shr , shl

shr/shl dest, count


-shr 명령과 shl 명령은 dest 오퍼랜드를 count 오퍼랜드에서 지정한 비트수 만큼 각각 오른쪽(shr), 왼쪽(shl)으로 이동

-결과는 dest 오퍼랜드에 저장


8) ror

ror/rol dest, count


-ror 명령과 rol 명령은 dest 오퍼랜드를 count 오퍼랜드에서 지정한 비트수 만큼 순환

-결과는 dest 오퍼랜드에 저장


9) xor

xor dest, src


-xor 명령은 dest 오퍼랜드와 src 오퍼랜드의 배타적 논리합을 dest 오퍼랜드에 저장

-xor eax, eax 처럼 dest와 src에 같은 레지스터를 놓고 사용하는 경우가 많고, 이 경우 같은 값에 대한 배타적 논리합이기 때문에

연산 결과는 0이다. 즉, 레지스터를 0으로 초기화 할 때 자주 사용


10) tset

test src1, src2


-test 명령은 src1 오퍼랜드와 src2 오퍼랜드의 교집합을 가져온다.

-cmp 명령과 마찬가지로 결과는 삭제



3. 분기 명령

1) jmp

jmp arg


-jmp 명령은 arg 오퍼랜드로 이동하는 명령

-조건 분기 명령과 달리 jmp 명령은 조건을 확인하지 않고 arg 오퍼랜드로 점프하기 때문에 '무조건 분기 명령'이라고도 한다.


2) call

call arg


-call 명령은 arg 오퍼랜드를 실행(호출)

-jmp 명령과 다른점은 call 명령은 호출한 후 해당 코드를 실행하고 돌아온다    -> ret 코드가 call 주소로 다시 돌려보내기 때문


3) ret

ret


-ret 명령은 call과 쌍이 되는 명령으로, 호출된 함수의 끝에 위치해 호출한 곳의 다음 명령으로 되돌아가게 한다.

-돌아갈 주소는 스택에 저장되어 있고 pop eip 와 같은 동작을 한다.



# leave 명령은 데이터 전송 명령이지만 ret 명령과 세트로 사용하는 경우가 대부분이다.

이 명령은 함수의 마지막 부분에서 ret 명령 앞에 호출되어 스택 포인터를 베이스 포인터와 같은 위치로 돌려준다.

그리고 스택에 저장되어 있던 호출자 함수 스택 프레임의 베이스 포인터를 복원한다.

즉, mov esp, ebp; pop ebp 와 같은 동작


 

'Programming > ASM' 카테고리의 다른 글

레지스터  (0) 2016.11.13
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함