* 어셈블리어
- AT&T => 리눅스 개발자들이 사용, 레지스터 앞에 %, 리터럴 값 앞에 $사용.
ex) CMD <source>,<dest><#command>
- NASM(Netwide Assembler) => 윈도우 에섬블러나 디버거들이 사용.
ex) CMD <dest>, <source> <;comment>
*어셈블리어 지시자
1. mov
=> <source>에서 <dest>로 데이터를 복사. 소스에 값이 없어지지 않음.
NASM문법 | NASM예제 | AT&T예제 |
mov <dest>, <source> | mov eax,51h;comment | movl $51h, %eax #comment |
ex)
mov eax, 1234h; 16진수 값 1234를 eax로 저장
mov cs, ax; 그런 다음 ax의 값을 cs로 복사
2. add, sub
=> add는 소스를 목적지에 더하고 결과를 목적지에 저장, sub는 목적지에서 소스를 뺀 다음 결과를 목적지에 저장.
NASM문법 | NASM예제 | AT&T예제 |
add <dest>, <source> sub <dest>, <source> |
add eax, 51h sub eax, 51h |
addl $51h, %eax subl $51h, %eax |
3. push, pop
=> 스택에 아이템을 넣거나, 빼기.
NASM문법 | NASM예제 | AT&T예제 |
push <value> pop <dest> |
push eax pop eax |
pushl %eax popl %eax |
4. xor
=> xor 값, 값 을 이용하여 값을 0으로 만들거나 레지스터나 메모리 위치를 지울 수 있음.
NASM문법 | NASM예제 | AT&T예제 |
xor <dest>, <source> |
xor eax, eax |
xor %eax, %eax |
5. jne, je, jz, jnz, jmp
=> eflag인 "zero flag" 값에 따라 다른 위치로 분기.
=> jne, jnz 는 "zero flag"=0 이면 해당 번지로 점프
=> je, jz 는 "zero flag"=1 이면 점프
=> jmp는 항상 점프
NASM문법 | NASM예제 | AT&T예제 |
jnz <dest> / jne <dest> jz <dest> / je <dest>
jmp <dest> |
jne start jz loop
jmp end |
jne start jz loop
jmp end |
6. call, ret
=> call은 프로시저를 호출 , ret는 프로시저 끝에서 호출 후 명령어 흐름으로 되돌아갈 때 사용.
NASM문법 | NASM예제 | AT&T예제 |
call <dest> ret |
call subroutine1 ret |
call subroutine1 ret |
7. inc, dec
=> 목적지 값을 늘이거나 줄이거나.
NASM문법 | NASM예제 | AT&T예제 |
inc <dest> dec <dest> |
inc eax dec eax |
incl %eax decl %eax |
8. lea
=> 소스의 유효한 주소를 목적지로 로드
NASM문법 | NASM예제 | AT&T예제 |
lea <dest>, <source> |
lea eax, [dsi+4] |
leal 4(%dsi), %eax |
9. int
=> 프로세서에 시스템 인터럽트 신호를 던짐. 사용할 공통 인터럽트는 커널에 시스템 호출을 보내는 0x80이다.
NASM문법 | NASM예제 | AT&T예제 |
int <val> |
int 0x80 |
int $0x80 |