본 게시물은 책 게임처럼 쉽고 재미있게 배우는 어셈블리 언어 튜토리얼 - 북스 홀릭 - 책을 참고하였습니다.
데이터 단위
bit. 데이터의 가장 작은 단위 0과 1 두가지 2진수만 표현할 수 있다.
byte : 8개의 비트를 모아서 하나의 바이트라 한다. 10진수 0~255, 16진수 0XFF까지 표현가능.
-> 레지스터에서 8BIT에 대응되는 레지스터는 AL, AH, BL, BH, CL,CH, DL,DH가 있다. [C언어에서 CHAR , BOOL형 데이터 타입이라고 보자 ]
word : 2개의 바이트를 하나로 표현하면 워드이다. [하나의 작업 단위 ]
10진수 - 0~65535, 16진수 0xFFFF,
16비트 레지스터는 AX, BX, CX, DX, SI DI BP SP IP가 있다.
DWORD (Double WORD) : 워드 2개를 하나로 표현하여 더블워드라 한다. 32bit 표현단위.
레지스터로 EAX, EBX, ECX, EDX, ESI , EDI , EBP, EIP가 있다. - 32bit 이후 시스템 부터 주소표현(포인터), 기본 정수 단위로 사용.
1bit
8 bit = 1byte
16 bit = 2 byte = 1word
32 bit = 4 byte = 2word .
64 bit = 8 byte = 4wrod.
어셈블리 언어의 기본 자원 3요소
1. 레지스터 <-> 2. RAM <-> 3. CPU
- 프로그램의 명령어는 램에 저장 [ 임시적으로 저장하는 메모리 장소 ]
- CPU는 명령어를 1개씩 가지고와서 명령을 해석 및 수행.
- 레지스터 : CPU가 요청을 처리하는데 필요한 데이터를 일시적으로 저장하는 기억장치, 실제 컴퓨터에 데이터를 영구적 저장하기 위해서는 하드디스크를 이용해야 하지만 명령들을 처리하기 위해선 이들의 주소와 명령의 종류를 저장할 수 있는 기억 공간이 하나 더 필요하다. 또한 명령을 수행하기 위해서는 메모리보다 빨라야 하는데 이것이 CPU옆에 붙어있는 레지스터 이다 .
- 공간은 작지만 CPU와 직접적으로 연결되어 있으므로 연산속도가 메모리보다 수백배 까지 빠르다.
- 또한 CPU는 자체적 데이터 저장 방법이 없기때문에 메모리로 직접 데이터를 전송할 수 없다.
- 64 BIT 단위 레지스터 ; RAX
- 32 BIT 단위 레지스터 : EAX
- 16 BIT 단위 레지스터 : AX
- 8 BIT 단위 레지스터 : AH, AL
해당 비트수는 명령을 한 번에 처리할 수 있는 레지스터의 비트수 이다.
용도 | 레지스터 | 설명 |
범용 | EAX | 산술/논리연산, 처리결과 리턴값 저장 |
EBX | 간접 주소 연산 | |
ECX | 카운터, 반복 참조 값 | |
EDX | 산술/논리 연산 보조 | |
인덱스 | ESI | 문자열 출발지 주소 |
EDI | 문자열 목적지 주소 | |
포인터 | ESP | 현재 스택 주소 |
EBP | 스택 복귀 주소 | |
EIP | 명령어 실행되는 현재 주소 | |
세그먼트 | CS | 코드(code) 세그먼트, 코드 영역 시작주소 |
DS | 데이터(Data) 세그먼트, 데이터 영역 시작주소 | |
SS | 스택(stack) 세그먼트, 스택 영역 시작 주소 | |
ES | 데이터 세그먼트 데이터영역 시작주소 | |
FS | ||
GS | ||
상태 | EFLAGS | cpu동작 제어, 연산 결과를 1또는 0으로 반영 |
FPU 수치연산 | ST0~7 | 부동소수점 처리 |
디버깅 | DR0~7 | 커널제어 |
제어 | CR0~8 |
EFLAGS 레지스터
시스템 제어용 플래그로 사용되거나 , 어셈블리 처리 조건 용도에서 사용되는 등 여러가지 상태 저장에 사용되는 레지스터
구분 | 플래그 | 설명 |
연산결과 | CF(Carry Flag) | 덧셈과 뺼셈에서 빌림수 발생시 1로 설정 |
PF(Parity Flag) | 연산 결과가 짝수이면 1, 홀수이면 0 | |
AF(Auxiliary-carry Flag) | 16비트 연산시 빌림수 발생 - 1로 설정 | |
ZF(Zero Flag) | 연산 결과가 0이면 1로 설정 | |
SF(Sign Flag) | 연산 결과가 최상위 비트 1 인경우 1로설정 | |
OF(Overflow Flag) | 연산 결과가 용량을 초과하였을경우 1로 설정 | |
시스템 제어 | TF(Trap Flag) | 프로그램 추적시 1로 설정. 명령 1번씩 실행하도록 한다. |
IF(Interrupt enable Flag) | 외부 인터럽트 요구를 받아들일때 1로 설정 | |
AC(Alignment Check) | CR0레지스터의 AM 비트와 함께 1 로 설정시 메모리 참조 정렬 체크활성화 | |
IOPL(I/O Privilege Level ) | 현재 특권 수준이 IOPL보다 높은 경우 I/O 주소 접근 | |
NT(Nested Task) | 연결 작업 제어, 1로 설정 시 현재 작업이 기존 실행 작업과 연결됨을 의미 | |
RF(Resume Flag) | 디버깅 시 프로세서에 일시 중지 예외 발생 제어 | |
VM(Virtual-8086 Mode) | Virtual-8086 mode 활성시 1로 설정 | |
VIF(Virtual- interrupt Flag) | 가상 이미지의 인터럽트 요구를 받아 들일떄 1로 설 정 | |
VIP(Virtual interrupt Pending) | 가상인터럽트가 지연시 1로설정 | |
ID( ID Flag) | CPUID 명령어 지원 여부로 1로 설정시 지원 | |
문자열 제어 | DF(Direction Flag) | 문자열 복사 명령과 관련된 제어 플래그, 1로설정되어 있으면 문자열 복사 시 주고값이 감소 |
'programming > assembly' 카테고리의 다른 글
어셈블리언어 기초 파해처 보기 - 5 (0) | 2020.10.25 |
---|---|
어셈블리언어 기초 파해처 보기 - 4 (0) | 2020.10.24 |
어셈블리언어 기초 파해처 보기 - 3 (0) | 2020.10.23 |
-어셈블리언어 기초 파해처 보기 - 1 (0) | 2020.10.23 |