어셈블리어 형식
어셈블리 자료형 | 크기 | C 자료형 |
BYTE | 1 byte | char |
WORD | 2 byte | short |
DWORD | 4 byte | int |
QWORD | 8 byte | double |
세그먼트 레지스터
: 프로그램이 실행되어 메모리에 로딩될 때 특정 영역의 메모리 주소를 저장하는 R
CS(Code Segment)
: 프로그램 실행 코드가 저장되어 있는 영역의 메모리 주소를 저장
DS(Data Segment)
: 프로그램에서 사용하는 전역 변수와 정적 변수가 저장되어 있는 영역의 메모리 주소를 저장
SS(Stack Segment)
: 프로그램에서 사용하는 함수를 처리할 때 생성되는 스택 영역의 메모리 주소를 저장
ES(Extra Segment)
: 변수들을 위해서 할당된 추가 영역의 메모리 영역 주소를 저장
대입 명령어
- MOV [Destination] [source]
sorce에 있는 값을 Destination에 저장한다. source 값은 변경되지 않음
ex) mov ecx, eax
- MOVZX [Destination] [source]
sorce에 있는 값을 Destination에 저장한다. 저장한 이후에 빈공간이 있으면 0bit로 채운다.
ex) movzx ecx, ax
- MOVSX [Destination] [source] (부호가 있는 경우)
sorce에 있는 값을 Destination에 저장한다. 대입한 이후에 빈공간이 있으면 부호 비트로 채운다.
ex) movsx ecx, ax
- MOVS
ESI 레지스터에 저장되어 있는 주소에 있는 값을 EDI 레지스터에 저장되어 있는 주소에 저장한다
- LEA [Destination] [source]
sorce에 있는 주소 값을 Destination에 저장한다
ex) LEA EAX, DWORD PTR SS:[EBP-4]
ebp-4의 주소값을 EAX에 저장하라.
사칙 연산 명령어
- ADD [operand 1][operand 2]
- 1과 2를 덧셈하여 1에 저장한다.
ex) ADD EAX, 5
EAX = EAX +5
- 지역 변수를 위한 스택 공간을 할당할 때 사용한다
ADD ESP, 8
- SUB [operand 1][operand 2]
- 1과 2를 뺄셈하여 1에 저장한다.
ex) sub eax,5
EAX = EAX - 5
- 지역 변수를 위한 스택 공간을 할당할 때 사용한다
SUB ESP, 8
- MUL [operand 1][operand 2]
- 1과 2를 곱셈하여 1에 저장한다.
ex) mul eax, ebx
EAX = EAX * ebx
- 지역 변수를 위한 스택 공간을 할당할 때 사용한다
SUB ESP, 8
- IMUL [operand 1][operand 2 ](부호가 있는 경우)
ex) imul eax, ebx
- 1과 2를 곱셈하여 1에 저장한다.
EAX = EAX * ebx
- 지역 변수를 위한 스택 공간을 할당할 때 사용한다
IMUL EAX, 8
- DIV [Operand]
EAX 레지스터 값과 operand를 나눗셈하여 몫을 eax레지스터에 저장한다.
만약 나눗셈 결과에 나머지가 있는 경우 나머지는 EDX에 저장한다
ex) DIV EBP-8
*나눗셈을 진행할 때 부호비트를 저장하기 위해서 저장 공간의 크기를 2배로 확장해야 한다. 그렇기 때문에 IDIV 명령어 실행전 저장 공간의 크기를 확장하는 명령어를 먼저 실행한다.
Intel | 크기 | 확장 |
CBW | BYTE | WORD |
CWD | WORD | DWORD |
CDQ | DWORD | QWORD |
증가 및 감소 명령어
- INC [Operand]
- DEC [Operand]
비교 관련 명령어
- CMP [Operand1] [Operand2]
op1과 op2를 비교한다.
1과 2를 뺄셈하여 결과 값이 0인지, 양수인지, 음수인지를 판단한다.
CMP 결과 값을 확인하여 함수 성공 및 실패를 확인할 수 있다.
ex) cmp eax, 2
cmp 명령어 다음에 조건 분기문이 나오며 cmp 비교 결과 값과 분기문 유형에 따라서 다음 코드를 수행하거나 또는 다른 코드가 있는 위치로 이동한다.
- TEST [Operand1] [Operand2]
op1과 op2를 AND 연산하여 결과 값이 0인지 확인한다
test 결과 값을 확인하여 함수 성공 및 실패를 확인할 수 있다
ex) test eax, eax
test 명령어 다음에 조건 분기문이 나오며 test 결과 값과 분기문 유형에 따라서 다음 코드를 수행하거나 또는 다른 코드가 있는 위치로 이동한다.
조건 분기 명령어
- JMP [Code Address]
JMP 명령어로 지정되어 있는 메모리 주소로 무조건 이동한다
JMP SHORT 00401040
SHORT-2byte
LONG - 5byte
무조건 401140 번지로 점프한다
- JZ/JE [Code Address]
JE(jump equal) [Code Address]
op1과 op2의 값이 같은 경우 해당 주소로 이동한다.
op1과 op2를 뺄셈하여 결과 값이 0인 경우 해당 주소로 이동한다.
ex) JE 401140
ZF=1인 경우에 401140으로 점프한다.
조건 : op1 == op2
- JNE(jump not equal) [Code Address] {JE와 반대}
op1과 op2의 값이 같지 않은 경우 해당 주소로 이동한다.
op1과 op2를 뺄셈하여 결과 값이 0이 아닌 경우에 해당 주소로 이동한다.
JNZ 401140
ZF=0인 경우에 401140으로 점프한다.
조건 : OP1 != OP2
- JLE(less) [Code Address]
op1이 op2보다 작거나 같은 경우에 해당 주소로 이동한다.
op1과 op2를 뺄셈하여 결과 값이 0이거나 음수인 경우에 해당 주소로 이동한다.
JLE 401140
ZF=1 or SF=1인 경우에 401140으로 점프
op1 <= op2
- JGE [code address]
op1이 op2보다 크거나 같은 경우에 해당 주소로 이동한다.
op1과 op2를 뺄셈하여 결과 값이 0이거나 양수인 경우에 해당 주소로 이동한다.
JLE 401140
ZF=1 or SF=0인 경우에 401140으로 점프
op1 >= op2
- JL [code address]
op1이 op2보다 작은 경우에 해당 주소로 이동한다.
op1과 op2를 뺄셈하여 결과 값이 음수인 경우에 해당 주소로 이동한다.
JLE 401140
ZF=0 or SF=1인 경우에 401140으로 점프
op1 < op2
- JG [code address]
op1이 op2보다 큰 경우에 해당 주소로 이동한다.
op1과 op2를 뺄셈하여 결과 값이 양수인 경우에 해당 주소로 이동한다.
JLE 401140
ZF=0 or SF=0인 경우에 401140으로 점프
op1 > op2
명령어 | 조건 | 결과 값 | 플래그 |
JE/JN | = | 0 | ZF=1 |
JNE/JNZ | != | 0 x | ZF=0 |
JLE | <= | 0또는 음수 | ZF=1 or SF=1 |
JGE | >= | 0또는 양수 | ZF=1 or SF=0 |
JL | < | 음수 | ZF=0 or SF=1 |
JG | > | 양수 | ZF=0 or SF=0 |
상태플래그
- ZF(zero Flag) - 비교 결과 값이 0이면 ZF=1 설정
- SF(sign flag) - 비교 결과 값이 음수이면 SF=1 설정
- CF(carry flag) - 부호 없는 숫자의 연산 결과 값이 비트 범위를 넘으면 CF=1 설정
- OF(overflow flag) - 부호 있는 숫자의 연산 결과 값이 비트 범위를 넘으면 OF=1 설정
스택 관련 명령어
- PUSH [Operand]
operand 값을 스택에 저장한다
push ECX
용도는 EBP 값을 스택에 백업할 때 사용하거나 함수의 인자값을 스택에 저장할 때 사용한다
PUSHAD 명령어는 EAX~EDI 레지스터에 저장되어 있는 값을 스택에 저장(백업)할 때 사용한다
- CALL [함수 시작 주소]
함수 시작 주소로 이동하여 함수 코드를 실행한다.
ex) CALL 401000
- POP [Operand]
ESP 위치에 저장되어 있는 값을 꺼내거나 제거할 때 사용한다
POP ECX
ESP 위치에 저장되어 있는 값을 꺼내서 ECX 레지스터에 저장한다
POPAD 명령어는 ESP 기준으로 저장되어 있는 8개의 값을 꺼내어 EAX ~ EDI 레지스터로 복원할 때 사용한다.
- RET
CALL 명령어를 통해서 호출된 함수를 종료하고 이전 함수의 다음 명령어로 이동한다.
pop eip를 실시하여 ESP 위치에 저장되어 있는 리턴 주소를 스택에서 꺼내어 EIP 레지스터에 저장한다.
JMP EIP를 실시하여 EIP 레지스터에 저장되어 있는 리턴 주소를 확인하여 이전 함수의 다음 명령어로 이동한다.
'강의 > 유튜브 : 어셈블리어' 카테고리의 다른 글
어셈블리어 (0) | 2025.04.06 |
---|