: OP code(명령 코드)와 operand(피연산자)로 구성
: (Intel) OP code에 따른 연산 결과를 왼쪽 operand에 저장
: immediate(상수), register, addressing mode
※ Addressing Mode : 레지스터에 저장된 메모리 주소를 참조한 값
ex) [reg] : reg에 저장된 메모리 주소의 값
byte prt[reg-1Ch] : Pointer Directive(declares one or more pointer data structures), reg-1C(hex)에 저장된 하위 8bit 참조
> mov dst, src : dst = src
> lea dst, addr : dst = addr, Load Effective Address, 연산도 같이 가능
> inc, dec dst : ++dst, --dst
> neg dst : -dst
> not dst : ~dst
> add dst, src : dst += src
> sub dst, src : dst -= src
> imul dst, src : dst *= src
> and dst, src : dst &= src
> or dst, src : dst |= src
> xor dst, src : dst ^= src
> shl, shr dst, k : dst << k, dst >> k, logical shift(빈 자리 다 0으로 밀어 채우기)
> sal, sar dst, k : dst << k, dst >> k, arithmetic shift(MSB 유지 후 빈 자리 0으로 채우기)
> test rax, rax : rax & rax, rax가 0일 경우 ZF=1, 음수일 경우 SF=1
> cmp rax, rdi : rax - rdi, rax = rdi일 경우 ZF=1, CF=0
rax != rdi일 경우 ZF=0
rax < rdi일 경우 ZF=0, CF=1
rax > rdi일 경우 ZF=0, CF=0
> jmp location : location으로 무조건 jmp
※ jcc : jmp 명령어 이전의 test나 cmp 등의 연산 수행 결과로 조건에 따라 location으로 jmp
> je location : ZF=1(equal)일 경우 jmp
> jne location : ZF=0(not equal)일 경우 jmp
> jg location : >, signed
> jge location : >=, signed
> jl location : <, signed
> jle location : <=, signed
> ja location : >, unsigned
> jb location : <, unsigned
> js location : SF=1(negative)일 경우 jmp
> jns location : SF=0(positive)일 경우 jmp
> push rdi : 스택에 새 데이터 추가
: sub rsp,8
mov [rsp], rdi
> pop rdi : 스택에 제일 최근에 추가했던 데이터 빼오기
: mov rdi, [rsp]
add rsp, 8
> call location : 함수 실행
: push retaddr
jmp location
> ret : 함수 종료 후 retaddr로 복귀
: pop rip // rsp에 있던 값이 rip에 들어가있음
jmp rip
006 Calling Convention (0) | 2020.09.19 |
---|---|
005 Stack (0) | 2020.09.19 |
003 Register (0) | 2020.09.19 |
002 Byte Ordering (0) | 2020.09.18 |
001 Reversing (0) | 2020.09.18 |