2016년 10월 9일 일요일

ASSEMBLY LANGUAGE FOR X86 PROCESSORS CHAPTER3

ASSEMBLY LANGUAGE FOR X86 PROCESSORS CHAPTER3

3장 어셈블리언어의 기초

정수상수
부호 한자리 이상의 숫자와 선택사항인 숫자의 밑을 나타내는 진수 로 구성
3A3h...


16진수는 문자로 시작하는 16진수 앞에 0을 넣는다.
문자와 문자열 구분없이 " " 또는 ' ' 로 둘러싸여 표시
"ABC"=3byte 'wxyz'=4byte

예약어 
명령어 니모닉 레지스터이름 디렉티브 연산자 미리정의된 기호
ex) mov add mul eax ebx ...

식별자
1-247문자
대소문자 구분하지 않음
-Cp 옵션을 주어 구분할 수도 있음

첫 문자는 알파벳 (_) @ ? 또는 $
예약어는 사용 불가

@ 기호는 어셈블러가 미리 정의된 기호의 접두사로 많이 사용하므로 피해

디렉티브 (Directives)
어셈블러가 인식하여 어셈블할 때에 처리하는 명령어
기계어와 관련이 없으며 실행시간에 실행되지 않음
대소문자 구분 없음
ex) dword mov

명령어
어셈블러에 의해서 CPU의 명령어 집합에 속하는 기계어로 변환됨
실행시간에 메모리에 적재되어 CPU에서 실행됨


레이블(label)
코드 레이블 데이터 레이블 

명령어 니모닉 ( Instruction Mnemonics)
명령어의 연산의 유형에 대한 힌트
ex) mov add sub...

피연산자 (operand)
즉시값 (상수 ..) 레지스터 메모리

주석
add ax,10 ;add 10
&~~~~&


정수수식
이 수식은 어셈블 할 때에만 계산될 수 있다는점이다. 정수수식은 실행 시간에 수행되는 수식이 아니다

NOP명령어
1 BYTE 크기로 아무 동작도 하지 않음
코드를 짝수 또는 4의 배수 주소로 정렬시키기 위해서 사용함

왜 ? -> x86 프로세서는 4의 배수의 주소에 있는 코드와 데이터를 더 빠르게 읽을 수 있음

-----
어셈블러는 오브젝트 파일이라고 부르는 기계어를 포함한 파일을 만든다
선택사항에 따라서 리스트 파일도 만든다
이 파일을 링커라고 하는 프로그램에 넘겨지며 링커로 실행 가능 파일을 만든다 exe

----data

정수 자료형
BYTEM SBYTE  8Bit
WORD, SWORD 16bit
DWORD, SDWORD 32bit
QWORD 64bit
FWORD 48bit
TBYTE 80bit

실수 자료형
REAL4 4BYTE(32bit)
REAL8 8Byte (64bit)
REAL10

하나의 데이터 정의 내에서 초기값들로 다른 진수 값들을 사용할 수 있다. 문자와 문자열 상수도 자유로이 섞어서 사용할 수 있다
list1 BYTE 10,32,41h

16진수 코드 0Dh(line 처음으로이동) 0Ah( 다음 line 으로 이동) 는 CR(carriage return line feed) 또는 줄끝문자라고 부른다
이 코드가 표준 출력으로 출력되면 커서를 다음 줄의 가장 왼쪽으로 이동시킨다.

DUP 연산자
반복 카운터로 사용하여 여러개의 데이터를 위한 저장공간을 할당
Array word 5 dup(0)

리틀엔디언
x86 프로세서들은 리틀 엔디언 순서를 사용하여 ( 하위부터 상위로) 데이터를 저장하고 꺼낸다
12345678h 를 저장하면 0000: 78 0001:56 0002: 34 0003 : 12

비초기화 데이터 선언
.DATA? 디렉티브는 비초기화 데이터를 선언한다. 그리고 컴파일된 프로그램의 크기를 줄여준다
비초기화 데이터 세그먼트 선언에 사용함
이 세그먼트를 실행파일에 포함시키지 않아서 프로그램 실행파일 크기를 줄여줌
.data?
bigArray Dword 5000 dup(?)

.code 세그먼트와 .data  세그먼트영역을 섞어서 사용가능함

기호상수
정수 수식 또는 텍스트를 식별자와 연관시켜 정의
정수수식 또는 텍스트 대신 사용

기호 상수 정의용 디렉티브
등호(=) EQU TEXTEQU

등호디렉티브
name=expression(32bit 상수)
값을 재정의 가능
COUNT=5 ..

배열과 문자열 크기계산
현재 위치 카운터: $ (현재 프로그램 문장에  대한 오프셋을 나타냄)
배열의 크기 계산
배열 자료를 정의한 바로 다음에서 다음 형태의 디렉티브 사용
SIZE=($-array시작번지)/(array 원소 크기)
ex
list BYTE 10,20,30,40
listsize=($-list)/1(byte)

EQU 디렉티브
EQU : 기호를 정수 또는 텍스트와 연관시킴
name EQU expression,symbol,<text>
재정의 될 수 없음

TEXTEQU
텍스트 매크로 라고도 함 텍스트 매크로 라고 하는것을 만든다
3가지 형식
    name TEXTEQU <text>
    name TEXTEQU textmacro
    name TEXTEQU %constExpr (수식)
재정의 가능

REal Address Mode 프로그래밍
장점 : MSDOS , BIOS 함수 호출 가능 , 메모리 접근 제한 없음
단점 : 세그먼트와 오프셋을 인식해야함 메모리가 640KB에서 제한됨
수정사항
DS값을 프로그램의 데이터 세그먼트 시작주소로 초기화해야함
mov ax,@data
mov ds,ax


댓글 없음:

댓글 쓰기