4장 어셈블리 프로그램 작성의 기본 어셈블러 어셈블리 언어 요소 예제 프로그램 데이터 정의 코딩 => 어셈블링 => 링킹 => 실행 (원시코드) (목적코드) (실행코드) 어셈블리 언어 요소 설명문 (Comment) 예약어 (Reserved Word) 식별자 (Identifier) 문장 (Statement) 지시어 (Directive) 예제 프로그램 데이터 정의 주의 : 어셈블리 코드 작성시, 디버그와 다르게 숫자는 10진수를 나타냄. 16진수는 H (123H) 2진수는 B (1010B) 사용 MOV AX, 10
TITLE A04SAM1 Skeleton of an .EXE Program page 60, 132 TITLE A04SAM1 Skeleton of an .EXE Program STACKSG SEGMENT PARA STACK ‘Stack’ ………. STACKSG ENDS DATASG SEGMENT PARA ‘Data’ DATASG ENDS CODESG SEGMENT PARA ‘Code’ MAIN PROC FAR ASSUME SS:STACKSG, DS:DATASG, CS:CODESG MOV AX, DATASG ; Set address of data MOV DS, AX ; segment in DS … MOV AX, 4C00H ; End processing INT 21H MAIN ENDP CODESG ENDS END MAIN
언어 요소 설명문 예약어 세미콜론으로 시작되는 문장 판독성을 향상시키나 기계 코드로 번역되지 않음 예) ADD AX, BX ; Accumulate total quantity 예약어 명령어 (ADD, MOV, …) 지시어 (END, SEGMENT, …) 연산자 (FAR, NEAR, …) 미리 정의된 기호 (레지스터 이름, .STACK, …) 부록 C 참조
식별자 2가지 용도 정의 규칙 이름 (name): 데이터의 주소를 참조하기 위해서 사용 COUNTER DB 0 레이블 (label): 명령어, 프로시쥬어, 세그먼트의 주소를 참조 MAIN PROC FAR 정의 규칙 첫번째 문자는 알파벳이나 특수 문자(‘.’은 제외), 다음에는 알파벳, 디지트 혹은 특수 문자가 올 수 있다. 특수 문자: ‘?’, ‘_’, ‘$’, ‘@’, ‘.’ 어셈블러는 @로 시작되는 특수어를 사용한다. 식별자의 길이는 최대 31 대, 소 문자는 구분이 안된다. 예) TOTAL, QTY250, $P50
문장 문장의 유형 문장 형식 명령어(Instruction): 기계 코드로 번역된다. 지시어(Directive): 어셈블러의 특정 행동을 지시 문장 형식 식별자 연산 피연산자들 ;설명문 COUNT DB 1 ; define a byte with 0 P30 MOV AX, 0 ; move 0 to AX RET ; return INC BX ; increment BX by 1
지시어(directives) 용도 PAGE TITLE 프로그램이 어셈블되고 출력되는 방법을 제어하는 수단 어셈블리 과정에서만 사용; 기계 코드로 번역되지 않음 PAGE 형식: PAGE [길이] [, 너비] 프로그램의 출력 형태 지정: 길이는 페이지당 줄 수, 너비는 줄 당 문자 개수 디폴트 값: PAGE 50, 80 TITLE 형식: TITLE 텍스트 [설명문] 각 페이지의 두 번째 줄에 텍스트가 출력된다.
SEGMENT 지시어 name SEGMENT [ align ] [ combine ] [ ‘class’ ] ….. name ENDS align: 세그먼트가 시작되는 경계 명시(디폴트: PARA) combine: 링킹 단계에서 다른 세그먼트와의 결합 여부 명시 다른 어셈블된 프로그램과 결합하고자 할 때 사용 PUBLIC, COMMON, STACK / 생략 혹은 NONE class: 링킹 단계에서 관련된 세그먼트를 그룹화시킬 때 데이터, 코드, 스택 세그먼트에 대해서 각각 ‘data’, ‘code’, ‘stack’을 사용 예) name SEGMENT PARA STACK ‘Stack’
PROC 지시어 segname SEGMENT PARA procname PROC FAR ….. procname ENDP segname ENDS 코드 세그먼트는 한 개 이상의 프러시쥬어를 포함한다 프로시쥬어는 PROC 지시어로 정의된다 PROC의 피연산자 FAR는 이 프로시쥬어가 실행의 시작점으로 사용된다는 것을 알려준다 다른 프로시쥬어의 피연산자는 생략되거나 NEAR이다.
지시어 ASSUME END ASSUME SS:stackname, DS:datasegname, CS:codesegname, .. 각 세그먼트의 용도를 알려준다 SS:stackname은 스택 세그먼트 이름을 SS 레지스터에 연관시킨다는 것을 의미한다. END END [procname] 프로그램 전체에 대한 끝을 명시한다. procname은 FAR로 명시된 프로시쥬어 이름이다 프로그램이 데이터 정의만을 포함할 경우에는 procname이 생략된다
DS 초기화 MOV AX, DATASG MOV DS, AX 프로그램 시작시 제일먼저 반드시 실행 CS와 SS를 초기화시키지 않은 이유 EXE. 프로그램을 적재시킬 때, 로더가 CS:IP, SS:SP를 초기화하나 DS, ES를 초기화하지 않기 때문 이때 DS, ES는 무슨 값을 가지고 있는가?
프로그램 종료 MOV AH, 4CH MOV AL, 00 INT 21H AH에는 인터럽트 처리기의 함수 코드가 저장된다. 위의 두 MOV는 한 개의 MOV로 표현될 수 있다:
예제 프로그램: 4-2
간단한 세그먼트 지시어 메모리 모델을 먼저 초기화한다 .MODEL 메모리-모델 모델 코드 세그먼트 수 데이터 세그먼트 수 모델 코드 세그먼트 수 데이터 세그먼트 수 TINY * * (.com용) SMALL 1 1 MEDIUM 1개 이상 1 COMPACT 1 1개 이상 LARGE 1개 이상 1개 이상
간단한 세그먼트 지시어 세그먼트 정의 지시어 ASSUME 지시어는 자동으로 생성 .STACK [크기] .DATA .CODE [이름] 디폴트 세그먼트 이름: STACK, _DATA, _TEXT 새로운 코드 세그먼트 이름 부여 가능 스택의 디폴트 크기는 1,024 바이트 DS 초기화 코드 변경 MOV AX, @data MOV DS, AX ASSUME 지시어는 자동으로 생성 따라서 프로그램에서 ASSUME 지시어 불필요
예제 프로그램: 4-3
데이터 정의 name Dn expression Dn: DB, DW, DD, DF, DQ, DT BYTE, WORD, DWORD, FWORD, QWORD, TWORD 식(expression) FLDA DB ? FLDB DB 25 FLDC DB 21, 22, 23, 24, 25, 26, …; MOV AL, FLDC + 3 DW 10 DUP(?) ; 20바이트 정의 DB 5 DUP(12) ; 12를 5번 반복(5바이트) DB 3 DUP(5 DUP(4)) ; 모두 4로 15바이트
문자 스트링 표현 스트링은 단일 인용 부호나 이중 인용 부호로 표현 3개 이상의 문자로 구성된 스트링은 반드시 DB로 정의 스트링은 ASCII 코드 형태로 메모리에 저장된다 DB ‘PC’ DB “PC” DB ‘Strawberry Jam’ DB “Crazy Sam’s CD Emporium” DB ‘Crazy Sam’’s CD Emporium”
수치 상수 이진수: 수치 다음에 B가 명시된다 십진수: D 혹은 생략 16진수: H, 첫번째 디지트는 반드시 0 ~ 9 예제: 3DH, 0DE8H 어셈블러는 모든 수치 값을 이진수로 변환하고, 이를 16진법으로 표현한다. 즉, 12, hex C, 1100은 동일한 값을 생성한다 문자와 수치 상수간의 차이 예) DB ‘24’ DB 24
데이터 정의 지시어 데이터 정의 단위 지시어 byte DB word DW double word DD farword DF 데이터 정의 단위 지시어 byte DB word DW double word DD farword DF quadword DQ ten bytes DT * 주의: 수치 상수는 2진수로 변환, 16진수로 표현, 역순으로 저장된다는 것에 주의. 예) DW 12345D 3039H DD 12345678D 00BC614EH
데이터 정의 지시어 DT Fig 4-4: 문자 스트링과 수치 값들의 정의 Fig 4-5: Fig 4-4의 데이터가 저장된 형태 packed BCD 수치 값을 정의하는데 사용 수치 상수를 16진수가 아닌 십진수로 저장 예) 12345678 Fig 4-4: 문자 스트링과 수치 값들의 정의 Listing의 내용은 DW, DD의 경우 반전 안 함. Fig 4-5: Fig 4-4의 데이터가 저장된 형태
EQU 지시어 C의 매크로(#define)와 같은 것을 정의한다. 어셈블러는 매크로를 정의된 값으로 대체한다. 예) FACTOR EQU 12 TABLEX DB FACTOR DUP(?) LIMITX EQU 25 …. MOV CX, LIMITX TOTSALES DW 0 TS EQU TOTSALES MPY EQU MUL
어셈블링 .LST 파일: .CRF 파일 오류 진단 어셈블 결과로, 번역된 기계 코드와 소스 코드를 보여준다 스택 세그먼트 데이터 세그먼트 코드 세그먼트 세그먼트와 그룹 테이블 심볼 테이블 Fig. 5-2, Fig. 5-4 .CRF 파일 프로그램에 정의된 심볼들에 대한 리스트를 보여준다. Fig. 5-5 오류 진단
링킹 역할 여러 어셈블 모듈을 한 개의 실행 모듈로 결합 .EXE 실행 모듈을 생성하고 초기화한다 링크 맵 생성
연습문제