레지스터 (Registers)
범용 레지스터 (General Purpose Registers)
64 | 32 | 16 | 8 | 8 |
RAX | EAX | AX | AH | AL |
RBX | EBX | BX | BH | BL |
RCX | ECX | CX | CH | CL |
RDX | EDX | DX | DH | DL |
RSI | ESI | SI | SIL | |
RDI | EDI | DI | DIL | |
RBP | EBP | BP | BPL | |
RSP | ESP | SP | SPL | |
R8 | R8D | R8W | R8B | |
... | ||||
R15 | R15D | R15W | R15B |
용도
산술 | AX | Accumulation | 계산 할 때 사용됨 |
BX | Base | 메모리 주소 저장에 사용됨 | |
CX | Counter | 반복문 카운터에 사용됨 | |
DX | Data | 곱셈이나 나눗셈 같은 경우에 AX와 같이 사용됨 | |
인덱스 | SI | Source Index | 복사나 비교할 인덱스의 출발주소 저장에 사용됨 |
DI | Destination Index | 복사나 비교할 인덱스의 목적주소 저장에 사용됨 | |
포인터 | BP | Base Pointer | 스택의 바닥주소 저장에 사용됨 |
SP | Stack Pointer | 스택의 최근주소 저장에 사용됨 |
세그먼트 레지스터 (Segment Register)
CS | Code Segment | 코드 시작 주소 |
SS | Stack Segment | 스택 시작 주소 |
DS | Data Segment | 데이터 시작주소 |
ES | Extra Data Segment | 보조로 두곳 이상의 데이터 저장영어 |
FS | 보조 세그먼트 레지스터 | |
GS |
상태 레지스터 (Status Register)
EIP / IP | 프로그램 실행 코드가 저장된 메모리 주소를 가르킴 |
EFLAGS / FLAGS | 플래그 저장 용도 |
플래그 (Flag)
0 | CF | Carry Flag | S | 부호 없는 산술 연산자 결과가 목적지보다 큰 경우 1 |
1 | 1 | |||
2 | PF | Panity Flag | S | |
3 | 0 | |||
4 | AF | Auxiliary Carry Flag | S | |
5 | 0 | |||
6 | ZF | Zero Flag | S | 산술 논리 연산의 결과가 0일 경우 1 |
7 | SF | Sign Flag | S | 산술 논리 연산의 결과가 음수일 경우 1 |
8 | TF | Trap Flag | X | 1 = CPU는 한 명령을 실행할 때마다 내부 인터럽트 발생 (디버깅) |
9 | IF | Interrupt Enable Flag | X | INTR 단자로부터의 외부 인터럽트를 0=무시, 1=수용 |
10 | DF | Direction Flag | C | 스트링 조작시 0번지 레지스터 값이 1씩 0=증가, 1=감소 |
11 | OF | Overflow Flag | S | 부호 있는 산술 연산자 결과가 목적지보다 큰 경우 1 |
12 | IOPL | I/O Privilege Level | X | |
13 | ||||
14 | NT | Nested Task | X | |
15 | 0 | |||
16 | RF | Resume Flag | X | |
17 | VM | Virtual 8086 Mode | X | |
18 | AC | Alignment Check | X | |
19 | VIF | Virtual Interrupt Flag | X | |
20 | VIP | Virtual Interrupt Pending | X | |
21 | ID | ID Flag | X | |
22 ~ 31 |
명령어
명령어 구성
Label | 작동코드 | 1 오퍼랜드 | 2 오퍼랜드 | 설명문 |
주소 지정 방식
1. 즉시 지정방식
- 값을 바로 넣는 방식
- ex) mov $0x4, %eax // 16진수 4를 eax에 넣는다
2. 레지스터 지정방식
- 레지스터 값을 넣는 방식
- ex) mov %esp, %ebp // 레지스터 %esp 에 들어있는 값을 레지스터 %ebp에 넣는다.
3. 직접 주소 지정방식
- 주소에 있는 값을 넣는 방식
- ex) mov %esp, $0x1535fe4 //
4. 간접 주소 지정방식
- 주소에 있는 주소에 있는 값을 넣는 방식
5. 베이스 상대 주소 지정방식
- 베이스 주소에 상대값많큼 이동한 주소의 값을 넣는 방식
Command | arg1 | arg2 | Description |
push | A | 값을 스택에 push | |
pop | A | eax에 스택 값을 pop | |
mov | A | B | A 값을 B로 옮김 |
len | ESI | B | ESI 주소값을 B로 옮김 |
inc | A | A 값을 +1 | |
dec | A | A 값을 - 1 | |
add | A | B | A 값을 B에 더함 |
sub | A | B | A 값을 B에 뺌 |
mul | A | EAX * A를 실행. 자리수가 넘치면 EDX에 넘친 자리수 저장 | |
div | A | EAX / A를 실행. 목은 AEX에, 나머지는 DEX 저장되고 A값은 그대로 남는다. | |
call | proc | 다음 명령어로 이동 | |
ret | 호출된 함수 -> 호출한 함수로 복귀. call 명령때 push 된 주소를 pop하여 eip에 저장 | ||
cmp | A | B | 값과 값을 비교 |
jup | proc | 특정 proc 주소로 가서 실행 | |
int | A | OS에 할당된 인터럽트 영역을 system call | |
nop | No Operation |
unsigned
je | if A == B |
jne | if A != B |
jz | if A == 0 |
jnz | if A != 0 |
ja | if A > B |
jae | if A >= B |
jna | if !(A > B) |
jnae | if !(A >= B) |
jb | if A < B |
jbe | if A <= B |
jnb | if !(A < B) |
jnbe | if !(A <= B) |
jc | if carry flag == 1 |
jnc | if carry flag == 0 |
jp / jpe | if parity flag == 1 / 짝수 |
jnp / jpo | if parity flag == 0 / 홀수 |
jecxz | jump ecx zero |
signed
jg | if A > B |
jge | if A >= B |
jng | if !(A > B) |
jnge | if !(A >= B) |
jl | if A < B |
jle | if A <= B |
jnl | if !(A > B) |
jnle | if !(A >= B) |
jo / jno | if overflow == 1 / 0 |
js / jns | if sign == 1 / 0 |
'IT > etc' 카테고리의 다른 글
[DIY] Magic Keyboard & Trackpad Tray 제작기 (0) | 2020.12.14 |
---|