- Integer Constant : 부호와 하나이상의 숫자 + 접미에 진수가 붙음(radix)
[{+|-}] digits [radix]
[radix] > h | r | q | o | t | d | y | b
> h : hexa, r : encoded real, q or o : octa, t : decimal(alterute)
d : decimal, y : binary(alterate), b : binary
※ 16진수는 변수와의 구분을 주기 위해서 만앞에 0을 붙여준다.
※ 만약 radix가 없다면 10진수로 생각!!
ex) 26 decimal / 32q octa / 1101b binary / 0A2h hexa
- Integer Expression : 정수 값과 산술 연산자를 포함하는 수학식, 32bit에 저장
- 실수 상수 : 10진 실수(decimal real)와 부호화된 실수(encoded real) 2개의 타입이 존재.
[sign] integer.[integer][exponent]
[sign] > { + , - }
[exponent] > E [{+,-}] integer
ex) +3.0 , 26.E5
- character constant : 홑 따음표나 겹따음표로 둘러싸인 하나의 문자
ex) 'a'
- String constant : 홑 따음표나 겹따음표로 둘러싸인 문자들의 열
ex) 'ABC', "Good morning"
> 스트링의 끝은 \0(null)로써 알려주는데, 자동적으로 들어가지는 않는다.
ex) variable BYTE 'ABC' > 3BYTE 이다.
> 내부에 다른 종류의 따음표가 들어오는 것은 관계가 없다.
> 같은 종류가 내부에 온다면 쌍의 개수가 같아야 한다.
ex) 'abc'(O), 'a'b'c'(O), 'a'bc'(X), "a'bc"(O), "a"b"c"(O)
- reserved word : 특별한 의미를 갖고 있으며 올바른 문맥에서만 사용 가능
ex) MOD, ADD, MUL, 수학연산자들, Symbol
- identifier : 프로그래머가 작성한 변수 이름으로 대소문자 구분을 하지 않는다.
- directive : 소스코드를 어셈블 할 때 어셈블러가 인식하고 활용하는 명령어
프로그램을 나눠즈는 구분자 역할을 한다.
ex) .data : 변수를 포함한 프로그램 영역
.code : 명렬어를 포함하는 프로그램 영역
[name] proc : 프로시져의 시작지점(프로시져 - 메소드, 프로세스 개념)
- label : 명령어 혹은 데이터의 위치를 표시하는 하나의 식별자
> code label : 프로그램의 코드 영역에서 레이블은 (:)로 끝난다.
> data label : 프로그램의 데이터 영역에서 사용될 경우 콜론으로 끝낼 수 없다.
> [Label1:] instruction mnemonic [operands]
- instruction mnemonic : 수행되는 동작을 식별하기 위한 짧은 단어
ex) mov(두개의 사이즈가 같아야 한다), add, sub, mul, jmp, call, ...
> Label과 variable은 주소값을 가지고 있는 것이다.(포인터 역할)
ex) Label 1: mov ax, 0
mov bx, 1
...
jmp Label 1 ; Label1로 돌아감.(위치로 가는 것이아니라, 주소로 찾아가는 것)
Label2 : BYTE "ABCDE" ; A위치의 주소값을 가지고 있다.
- operend : 레지스터 이름, 변수이름, 상수표현, 상수값이 피연산자로 올 수 있다.
- comment : ';'한줄 주석 / 사용자 지정 symbol ~ symbol
* Program ex... 3정수의 합
TITLE ADD AND SUBSTRACT
; THIS PROGRAM ADDS AND SUBSTRACTS 32BIT INTEGERS
INCLUDE Irvin32.inc
.code ; code segment의 시작을 알린다.
main PROC ; PROC : 디텍티브가 프로시저 시작을 알린다.
move eax, 1000h ; EAX = 1000h
add eax, 4000h ; EAX = 5000h
sub eax, 2000h ; EAX = 3000h
call DumpRegs ; display register
; 현재 CPU의 register 값을 표시하는 프로시져 호출
exit ; 미리 정의된 MS함수를 간접적으로 호출
main ENDP
END main
- segment : 코드, 데이터, 스택 세그먼트로 구성되어 있다.
> code segment : 프로시저를 하나 이상 포함하며, 프로그램의 모든 실행문이 있는 시작을 알린다.
> stack segment : 프로시저 매개변수나 지역변수들을 가진다.
> data segment : 변수를 저장
* Assemble-Link-Execute cycle
ⓐ text editor를 사용해 source file을 생성
ⓑ assembler는 source file을 object file로 변환
(옵션에 따라 listing file도 생성, listing file : 프로그램 소스 코드 복사본
ⓒ linker에 object file을 읽은후 의해서 link library안에 있는 프로시져를 호출하는지 점검 후
필요한 프로시저는 object 파일과 합쳐서 executable file을 생성
(옵션에 따라 map file을 만들 수 있다, map file : 링크될 프로그램에 포함된 세그먼트 정보)
(map file has "exe module name, list of public symbol, start address, segment name, ...)
ⓓ loader를 이용해 실행 파일을 메모리로 읽어 드리고 프로그램의 실행 결과 값을 도출한다.
* Data 정의
- 데이터 정의문
[name] directive initializer [initializer] ...
※ initializer는 필수이다. ?로 표시해서 라도 null로 초기화
ex) VALUE1 BYTE 'A'
VALUE2 SBYTE -128
VALUE3 BYTE ? ; 프로그램 실행시 값이 할당 될 것을 알름
LIST BYTE 10,20,30,40 ; 배열과 같이 생성
STRING1 BYTE "GOOD AFTERNOON", 0
; 0 C의 \0와 같이 0으로 문자열의 끝을 알린다.
VALUE3 BYTE 20*30, 1 ; 2BYTE짜리이다. ','로 구분되는 것으로 새야한다.STRING3 BYTE "HELLO", 0DH, 0AH, 0
; 0DH, 0AH > CR | LF 로 커서를 다음줄 맨왼쪽으로 보낸다. 총 8byte이다.
- 각 변수를 지정해주면 OFFSET값이 0부터 BYTE크기 만큼씩 증가한다.
* Symbol constant
- 저장 공간을 미사용하며, 실행중에 값이 변하지 않는다.
- 변수와의 차이점!!
- equal sign
name = expression
ex) count = 500
mov ax, count
-------------
mov ax, 500
어떻게 작성을 하나 어셈블러는 아래와 같이 동작할 것이다.
- symbol을 사용하는 이유 : 프로그램 사용시 500을 자주 사용시, 나중에 유지 부수때 이점이 있다.
* 배열과 문자열의 크기 계산
- 어셈블러가 자동적으로 계산하게 만드는 것이 system 가용성 면에서 좋다.
- size는 현재 위치를 나타내는 카운터 '$'를 사용한후 list offset을 감하고, 데이터 size로 나눈다.
ex) list BYTE 10,20,30,40
listSize = ($-list)/size
- 정확한 길이를 알기 위해서는 배열 생성과 동시에 길이를 계산해 주는 것이 좋다.
* DUP(duplicate)
- TYPE 개수 DUP(data)
ex) BYTE 20 DUP(0) => 20개의 0의 BYTE가 복제된다.(20BYTE)
1BYTE * 20 DATA VALUE = 0
BYTE 4 DUP ("ABC")
1BYTE * 4 * 3BYTE = 12BYTE
WORD 5 DUP(1000H)
2BYTE * 5 * 1 = 10BYTE
ATABLE BYTE 4 DUP(3 DUP(0), 2 DUP(X))
1BYTE * 4 * ( 3 + 2 ) = 20 BYTE // ','로 구분을 잘하자 000XX000XX000XX000XX
* EQU directive
- 심벌 이름을 정수 수식이나 임의의 문자와 연결 = const 개념
- Equal sign과 다르게 redefine이 불가능하다.
- text를 EQU할때는 '<>'로 묶어준다.
syntax) name EQU expression
ex) MATRIX1 EQU 10*10
MATRIX2 EQU <10*10>
M1 WORD MATRIX1 ; 100으로 치환. 100값을 가진 WORD 하나가 생성
M2 WORD MATRIX2 ; 10*10의 문자열로 치환. 5*2 = 10BYTE의 데이터공간을 소모
- TEXTEQU 디렉티브
> 문자 메크로를 만들 수 있다. 특정 행동을 정의
> redefine이 가능하다.