ㅇ 어셈블리어
ㄴ 어셈블리어 표현방식 : AT&T, Intel
AT&T : 리눅스
- OPCODE 원본, 사본
- cp file1 file2 //file1을 file2로 복사함
Intel : 윈도우
- OPCODE 사본, 원본
ㄴ add, sub
x = x + y;
add x, y //x와 y를 더해서 x에 넣음
x = x - y;
sub x, y //x - y를 해서 x에 넣음
ㄴ mov, lea, (movl, movw, movb) à 둘 다 복사 명령어지만, mov는 주소에 해당하는 값을 lea는 주소값을 가져옴
(movl, movw, movb) à 각 옮길 값의 사이즈를 4, 2, 1 바이트 만큼 복사함
x = y;
mov x, y //y에 있는값을 x로 복사(이동)
***à 목적지가 어떤 피연사인지에 따라 x혹은 y에 넣는데 이것은 표현 방식에 따라 다름
mov esp, 1 //1을 esp에
mov 1, x //인텔 방식에서 불가능XXX
mov esp, ebp //ebp값은 esp로
mov esp, [ebp] //[ebp]의 주소를 따라가서 공간에 있는 값은 esp로 저장
mov esp, [addr] //[]안에 있는 주소를 따라가서 그 공간에 저장되어 있는 값을 저장함
mov esp, [ebp+4] //ebp의 주소 값 자체에 4를 더한 주소의 값을 저장
ex) 0x12345677 > 10 이면 주소값에 4를 더하여(0x1234567C > 5) 해당 주소의 값이 esp에 저장됨
mov esp, ebp + 4 //이런 형식도 불가능, 연산이 두 번 일어남XXX
lea esp, [ebp+4] //ebp의 주소에 4를 더한 주소값을 저장
> add ebp, 4 //ebp에 4를 더한 값을 ebp에 저장
mov esp, ebp //ebp의 값을 esp로
ㄴ cmp, test : 데이터의 두 값 비교 시 사용
cmp -> 값이 참이면 참
ㄴ push, pop
push 1 //1값을 스택에 값을 추가함 (현재 스택 포인터에 명시한 값 삽입)
à 푸쉬 전 스택이 어디까지 사용하고 있는지 알아야만 사용가능(현재 스택 포인트가 어디인지 : ESP)
à 푸쉬를 하면 자동으로 ESP에 들어가는 값이 1만큼 감소함 (스택사이즈 증가)
pop ebp //현재 스택 포인터에 위치한 값을 꺼내와 오른쪽 피연산자 저장소에 저장함
à 스택사이즈 감소
à ESP값 증가
pop 1 //상수값이 올 수 없음, 저장소명이 와야함 XXX
ㄴ jmp, call
jmp 메모리주소(코드영역) //다음번 실행시킬 명령어가 명시한 메모리주소 분기
à함수 호출 시 사용됨 (CPU가 EIP값을 가져와서 읽고 해당 코드를 실행함)
call 메모리주소(함수명)
> push eip
jmp 메모리주소
ㄴleave
> mov ebp, esp (AT&T 기준)
pop ebp
ㄴ ret
> pop eip
ㄴ and, or, not, shift