어셈블리 도전!
다행이도 번역된 어셈블리언어 자료를 구할수 있게되었다. 감사합니다. ㅎ 아래에 파일 첨부.
기수법중
최상의 비트를 MSB(Most significant Bit)
차하위 비트를 LSB(Lesast significant Bit) 라 한다.
메모리의 단위 ( 각각 다름)
워드 (word) |
2 바이트 |
더블워드 (double word) |
4 바이트 |
쿼드워드 (quad word) |
8 바이트 |
패러그래프(paragraph) |
16 바이트 |
워드란? 하나의 연산을 통해 저장 장치로부터 프로세서의 레지스터에 옮겨 놓을 수 있는 데이터 단위이다. 프로세서마다 각각 다르다. 한 워드에는 한 개의 컴퓨터 명령어, 저장 주소 처리되어야 할 응용프로그램 데이터를 저장 할 수 있다.
1.2.3 CPU 80x86계열
8088, 8086 :
보호모드 및 섹렉터에 대해 설명 5 ~ 9 다치 참고 하도록..
CPU 마다 각각의 고유한 기계어를 가지고 있고 고유의 어셈블리어를 가지고 있다. 이책에서는 NASM(Netwide Assembler)
1.3.3 피연산자
명령들에 따라 피연사의 형태와 개수가 다르다. 보통 고정된 피연산자수(0-3)를 갖는다. 피연산자의 종류로는
레지스터 : CPU레지스터들에게 직접적으로 접근
메모리 : 메모리에 저장된 데이터를 가리킨다.
즉시 피연산자 : 즉시 피연산자(immediate) 는 명령 자체에 있는 고정된 값들이다. 이들은 명령 자체에 저장된다
(즉, 세그먼트가 아닌 코드세그먼트에 저장됨) ?
묵시적 피연산자 : 묵시적 피연산자(implied)는 정확히 나타나지 않는다.
예를들어 증가 명령은 레지스터나 메모리에 1을 더한다. 이때 1을 묵시적 피연산자라고 한다.
1.3.4 기초명령
mov 이 명령은 두개의 피연산자를 필요로한다.
move dest, src ; src에 있는데이터가 dest로 복사된다. 이때 두 피연산자가 모두 메모리면 안된다. 또한 두 피연산자의 크기가 같아야된다.
mov eax, 3 ; eax 레지스터에 3을 대입한다.(3은 즉시 피연산자 이다)
inc ecx ; ecx++
dec dl ; dl--
1.3.5 지시어
지시어 (directive)는 CPU가 아닌 어셈블러를 위해 만들어 진 것이다. 어셈블러에게 무언가를 알려주는 역할을 한다.
지시어는 기계 코드로 변환되지 않는다. 주용도
- 상수를 정의한다.
- 데이터를 저장할 메모리를 저장한다.
- 메모리를 세그먼트로 묶는다.
- 조건적으로 소스코드를 포함시킨다.
- 다른 파일들을 포함시킨다.
NASM은 C와 비슷한 전처리 명령들이 있다. 그러나 NASM의 전처리기 시지어는 C어서의 #이 아닌 %를 사용한다.
equ 지시어
equ 지시어는 심볼(symbol)을 정의할 때 사용. 심볼은 어셈블리 프로그래밍시 사용되는 상수를 뜻한다.
ex) symbol equ value
한번 정의된 심볼의 값은 절대로 재정의 될 수 없다.
The % 정의 지시어 C언어듸 #define 지시어 와 동일
print_int EAX 에 저장된 값을 화면에 출력한다.
print_char AL 에 저장된 아스키 코드 값에 대응 하는 문자를 화면에 표시한다
print_string EAX 에 저장된 문자열의 주소값 에 해당하는 문자열을 화면 에 출력한다. 문자열은 반드시 C 형식
이어야 한다 (i.e. null 로 종료).
print_nl 화면에 개행문자를 출력한다.
read_int 키보드로 부터 정수를 입력받은 다음 EAX 레지스터에 저장
한다.
read_char 키보드로 부터 한 개의 문자를 입력 받은 후 그 문자의 아스키코드값을 EAX 레지스터에 저장한다.
어셈블리 I/O 루틴
PC 어셈블리언어 지은이 : Paul A.Carter
번역자 : 이재범