728x90
어셈블리 변수
data type | size |
BYTE | 부호 없는 1byte |
WORD | 부호 없는 2byte |
DWORD | 부호 없는 4byte |
QWORD | 부호 없는 8byte |
어셈블리 산술 연산
명령어 | 수행내용 | 참고 |
MOV a, b | a = b (b를 a에 대입(복사) | |
ADD a, b | a += b | |
SUB a, b | a -= b | |
INC a | a += 1 | 기계코드 크기가 ADD, SUB 보다 더 작다 |
DEC a | a -= 1 | 기계코드 크기가 ADD, SUB 보다 더 작다 |
movzx a, b | a가 b보다 큰 공간이어도 복사가 되고, 남는 공간은 0으로 채워짐 | 부호가 없는 정수에만 사용 |
movsx a, b | 남는 공간이 1로 채워짐. | 부호가 있는 정수에만 사용 |
어셈블리 조건
지시 | 정의 | 플래그 |
JMP | 무조건 분기 명령을 실행 | |
J<조건> | 조건에 따라 수행(set = 1, unset = 0) | |
JE / JZ | Jump Equal or Jump Zero | ZF |
JNE / JNZ | Jump Not Equal or Jum Not Zero | ZF |
JG / NLE | Jump Greater or Jump Not Less/Equal | OF, SF, ZF |
JGE / JNL | Jumb Greater / Equel or Jump Not Less | OF, SF |
JL / NGE | Jump Less or Jump Not Greater/Equal | OF, SF |
JLE/JNG | Jump Less/Equal or Jump Not Greater | OF, SF, ZF |
특별한 용도 - fla 조건
지시 | 정의 | 플래그 |
JXCZ | Jump if CX is Zero | none |
JC | Jump If Carry | CF |
JNC | Jump If No Carry | CF |
JO | Jump If Overflow | OF |
JNO | Jump If No Overflow | OF |
JP / JPE | Jumb Parity or Jump Parity Even | PF |
JNP / JPO | Jump NO Parity or Jump Parity Odd | PF |
JS | Jump Sign (negative value) | SF |
JNS | Jump No Sign (positive value) | SF |
비교 명령 CMP
명령어 | 수행 내용 | 참고 |
CMP a, b | a - b에 따라 플래그들이 세팅된다 |
CALL, RET
명령어 | 수행 내용 |
call | 서브프로그램으로 무조건 분기를 한 후, 그 다음에 실행될 명령의 주소를 스택에 푸시 |
ret | 그 주소를 팝한 후 그 주소로 점프 |
어셈블리 기본 구문
data section
section.data
초기화된 데이터, 상수 선언을 위한 공간
런타임에 변하지 않는 데이터들
상수, 파일 이름, 버퍼 사이즈 등을 선언
BBS section
section.bbs
Block Starting Symbol
변수 선언을 위한 공간
Text section
section.text
global _start
_start:
실제 코드 저장을 위한 공간
문법
x64 intel 문법
Opcode Operand1, Operand2 ;주석
- opcode(명령어), operand(인자값)
- operand1 : src, operand2: dst
- 특정 레지스터의 메모리 주소를 참조할 때는 대괄호를 사용
- Offset: EAX 레지스터에서 +4 만큼 떨어진 메모리 주소를 표기할 때는 [EAX + 4]와 같이 표현
- 세미콜론으로 주석 처리
x64 레지스터의 종류
레지스터는 CPU가 요청을 처리하는데 필요한 데이터(명령어, 연산결과, 복귀주소 등)을 일시적으로 저장하는 기억장치이다.
범용 레지스터
- RAX(Accumulator) : 더하기, 빼기 등 산술/논리 연산을 수행하며 함수의 return 값이 저장
- 시스템 콜 함수를 사용하려면 RAX에 함수의 syscall 번호를 넣어준다.
- RBX(Base) : 메모리 주소를 저장하기 위한 용도로 사용
- RCX(Count) : 반복문에서 카운터로 사용되는 레지스터. 인덱스와 같은 역할을 하지만 ECX는 미리 반복 값을 정해두고 명령어를 사용할 때 마다 값이 하나씩 줄어든다는 점이 다르다.
- syscall을 호출했던 사용자 프로그램의 return 주소를 가진다.
- RDX(Data) : 다른 레지스터를 서포트하는 여분의 레지스터. 큰 수의 곱셈이나 나눗셈 연산에서 EAX와 함께 사용된다.
인덱스 레지스터
- RSI(Source Index) : 데이터를 복사할 때 src데이터, 즉 복사할 데이터의 주소가 저장된다.
- RDI(Destination Index) : 데이터를 복사할 때 복사된 dest 데이터의 주소가 저장된다.
플래그 레지스터
- RFLAGS register : 시스템 제어 용도 혹은 어셈블리에서는 비교/조건문 처리 용도로 사용되는 상태 레지스터이다. 연산 결과에 따라 64비트 레지스터의 각 비트에 0(clear, reset) 혹은 1(set)으로 표시해 처리 결과를 저장한다.
- CF (Carry Flag) : 부호 없는 수 끼리 연산 결과가 자리올림/자리내림이 발생할 때 1, unsigned int 값을 벗어날 때 1
- OF (Overflow Flag) : 부호 있는 수 끼리 연산 결과가 Overflow인 경우 1
- SF (Sign Flag) : 연산 결과 최상위 비트가 1인 경우 1
- ZF (Zero Flag) : 연산 결과가 0이면 1
- AF (Auximiliary-carry Flag) : 16비트 연산시 자리올림/자리내림이 발생할 때 1
- PF (Parity Flag) : 연산 결과가 짝수면 1, 홀수면 0
- DF (Direction Flag)
- IF (Interrupt Flag)
- TF (Trap Flag)
이 외에도, 64비트에서는 R8 ~ R15까지 8개의 레지스터가 추가로 사용되며, 하나의 레지스터는 아래 그림처럼 크기에 따라 적절히 쪼개 사용할 수 있다.
RAX(64 bits) EAX(32 Bits, Extended AX) AX(16bits) AL(8bits) AH(8bits)
Syscall table
728x90
300x250