본문 바로가기

IT/etc

[어셈블리어] 기초

레지스터 (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