제4장 어셈블리어
학습내용 프로그래밍 언어 어셈블리어 개요 어셈블리 프로그래밍 MASM 사용법
프로그래밍언어 계층
고급언어와 어셈블리어 예 b =1; c= 2; a = b+c; mov dword ptr [ebp-8],1 mov dword ptr [ebp-0Ch],2 mov eax,dword ptr [ebp-8] add eax,dword ptr [ebp-0Ch] mov dword ptr [ebp-4],eax
원시프로그램의 번역 과정 보조기억장치 주기억장치 운영체제 원시코드 컴파일러 프로 세서 목적코드 목적코드
고급언어와 저급언어에서 번역 고급언어 사용 저급언어 사용 자연어 (프로그래밍) (프로그래밍) 원시 코드 고급 언어 :1 원시 컴파일러 어셈블러 목적 코드 목적 코드 :n 기계어 :1
고급언어와 어셈블리어 고급언어 자연어와 가깝다 컴퓨터 동작에 대하여 알 필요가 없다 하나의 명령어는 수십 개의 기계어 프로세서에 호환 프로그램 이해가 용이하고 배우기 쉽다
고급언어와 어셈블리어 어셈블리어 기계어에 가깝다 컴퓨터의 각 장치들의 구체적 동작 제어 기계어 하나에 하나의 니모닉 명령어 프로세서 마다 따로 정의 프로그램이 난해하며 배우기 힘들다 빠른 속도
어셈블리어 (4-1) 명령어의 형식 2-번지 명령어의 예 프로그램의 형태와 예 MOV 명령에서 연산항의 조합 명령어의 순차적 실행 명령어의 조건적 분기와 예 무조건 분기와 예
어셈블리어의 개요 상징적인 연상 기호사용 기계어와 일대 일 대응 대표적인 저급언어 주로 시스템프로그래밍에 사용 하드웨어 이해에 적합
수행문의 구성 [Lable:] Mnemonic [Operand] [;Comment] 빈칸을 이용하여 구분 레이블은 하나의 어셈블리 명령어에 대하여 어떤 이름을 부여하는 것 다른 명령어는 그 이름을 사용하여 연관된 어셈블리 명령 참조 31문자까지 가능, 콜론(:)으로 끝난다. 알파벳, 숫자, 특수문자(?,,,@,$) 첫문자로 숫자는 사용하지 않음, 마침표는 반드시 첫자리에 레지스터 이름은 쓰지 않는다.
수행문의 구성 연상코드 : 어셈블리 언어를 배우는 것 피연산자 : 명령어에 따라 다르다. 두 개 이상 일 때는 쉼표로 구분
수행문의 성격 어셈블리 지시어 어셈블리 명령어 컴퓨터가 무엇을 하도록 지시하는 것이 아니고 어셈블러에 대한 지시 사항을 전달 기계어로 번역되지 않는다 어셈블리 명령어 컴퓨터로 하여금 무엇을 수행하라고 직접 명령 기계어로 번역
명령어의 형식 연산항을 갖지 않는 명령어 * CLC 하나의 연산항을 갖는 명령어 * DEC CX 두개의 연산항을 갖는 명령어 * MOV AX,BX
2 개의 연산항을 갖는 명령어 MOV AL,BL MOV AX,BX 1 2 3 4 1 2 3 4 출발항 BX 실 행 전 BX 16 8 7 0 16 8 7 0 1 2 3 4 1 2 3 4 출발항 BX 실 행 전 BX BH BL BH BL 0 0 0 0 0 0 0 0 목적항 AX AX AH AL AH AL 1 2 3 4 1 2 3 4 출발항 BX 실 행 후 BX BH BL BH BL 0 0 3 4 1 2 3 4 목적항 AX AX AH AL AH AL
상수 정수 문자상수 표시는 대문자 또는 소문자(b/ o,q/ d/ h) 16진법 첫 숫자는 반드시 아라비아 숫자 abcH 0abcH 16진법에서 A,B,C,D,E,F는 대/소문자 아무표시가 없으면 10진수 문자상수 ‘A’ ‘AB’ ‘Can’’t’ “Can’t”
어셈블리 지시어 프로그램 출력 지시어 프로세서 관련 지시어 데이터 관련 지시어
프로그램 출력 지시어 프로그램 출력 지시어 lines : 10~255 , default : 57 PAGE [lines] [,columns] TITLE text (임의의 문장) SUBTTL text(임의의 문장) lines : 10~255 , default : 57 columns : 60~132, default : 80 TITLE의 text 내용은 각 페이지 둘째 줄 왼쪽 SUBTTL의 text 내용은 셋째 줄 오른쪽
프로세서 관련 지시어 프로세서 관련 지시어 어떤 프로세서에서 쓰이는 명령어인지 어셈블러에게 지시 Default : .8086 .8086 .8087 .286 어떤 프로세서에서 쓰이는 명령어인지 어셈블러에게 지시 Default : .8086
데이터 관련지시어 데이터 관련 지시어 데이터 정의(DB, DW, DD, DT) 심볼 정의(EQU, =) 외부 프로그램 참조(PUBLIC, EXTRN, ICLUDE) 영역 정의(SEGMENT, ASSUME, PROC) 어셈블리 제어(END, EVEN, ORG)
데이터 정의 DB : 1 바이트 이상의 메모리 할당 DW : 2 바이트 메모리 할당 DD : 4 바이트 메모리 할당 DT : 10 바이트 메모리 할당
데이터 정의 max DB 255 wmax DW 65535 table DB 0,1,2 table DB 0 DB 1 DB 2 table DB 4 DUP(3), 8, 3 DUP(7) temp DB ? temp1 DW 12 DUP(?) 문자는 DB 사용 : msg DB “hello”
심볼 정의 EQU : 프로그램 내에서 변경할 수 없다. = : 프로그램 내에서 변경 가능하다.
외부 프로그램 참조 여러 프로그램을 연결 편집하여 하나의 수행 가능한 프로그램을 만들 때 각각의 프로그램 간에 서로 정보를 주고 받아야 한다. PUBLIC symbol[,…] 외부 사용자가 이 프로그램을 사용해도 좋다 EXTERN name : type[, …] 다른 곳에서 정의된 것을 사용하겠다 type : byte, word, dword, NEAR, FAR, ABS(EQU, =)
연산자 산술연산자(+,-,*,/,MOD,SHL,SHR) 논리연산자(AND,OR,XOR,NOT):비트단위 abc EQU 00110010B SHL 2 def EQU abc SHR 2 논리연산자(AND,OR,XOR,NOT):비트단위 관계연산자(EQ,NE,LT,GT,LE,GE) mov ax, const EQ 20 const가 20이면 ax는 FFFFh가 저장
프로그램의 기본형태 MAIN SEGMENT ASSUME CS:MAIN 프로그램 블록 MAIN ENDS END
문자 A를 출력하는 프로그램 1 MAIN SEGMENT 2 ASSUME CS : MAIN 3 MOV DL, ‘A’ 4 MOV AH, 2 5 INT 21H 6 MOV AH, 4CH 7 INT 21H 8 MAIN ENDS 9 END
MOV <operand1>, <operand2> 직 접 값 간접 operand1 범용 r. 세그먼트 r. 범용 r. 세그먼트 r. (CS는 제외) 간접:메모리주소 ○ × ○ ○ × ○ ×
MASM MASM TEST.ASM LINK TEST TEST
4-1 어셈블리어 요약 어셈블리언어의 개념 이해 명령어의 형식 이해 프로그램의 작성방법 이해
명령어의 조건적 분기 CX레지스터가 0일때만 분기 플래그 SF ZF PF CF OF CX 1:분기 JS JZ/JE JP/JPE JB/JNAE JO - 0:분기 JNS JNZ/JNE JNP/JPO JNB/JAE JNO JCXZ 1일때의 의미 보수표현으로 음수 결과가 0 1의 수가 짝수개 캐리플래그가 1 결과의 범위초과 CX레지스터가 0일때만 분기
조건적 분기 명령의 예 CMP AX,100 JA Loop1 * if AX>100 then Loop1으로 분기 JE Loop2
1~100 합을 구하는 프로그램 1 MAIN SEGMENT 2 ASSUME CS:MAIN, DS:MAIN 3 MOV AX, CS 4 MOV DS, AX 5 MOV CX, 1 6 MOV AX, 0 7 LOOP1: ADD AX, CX 8 INC CX
1~100 합을 구하는 프로그램 9 CMP CX, 100 10 JBE LOOP1 11 MOV SUM, AX 12 MOV AH, 4CH 13 INT 21H 14 SUM DW ? 15 MAIN ENDS 16 END
무조건 분기의 형태 기억장치 IP N JMP N-2 OVER N d =OVER - N . OVER
소문자를 대문자로 변환 1 MAIN SEGMENT 2 ASSUME CS:MAIN 3 L1: MOV AH, 1 4 INT 21H 5 CMP AL, 1AH 6 JE FIN 7 CMP AL,‘a’ 8 JB L2 9 CMP AL,‘z’
소문자를 대문자로 변환 10 JA L2 11 SUB AL, ‘a’-‘A’ 12 L2: MOV DL, AL 13 MOV AH, 2 14 INT 21H 15 JMP L1 16 FIN: MOV AH, 4CH 17 INT 21H 18 MAIN ENDS 19 END
주소지정방식 값 즉시 지정방식 직접 주소지정방식 간접 주소지정방식 * 레지스터 간접 주소지정 * 베이스 주소지정 레지스터 직접, 메모리 직접 간접 주소지정방식 * 레지스터 간접 주소지정 * 베이스 주소지정 * 인덱스 주소지정 * 베이스 인덱스 주소지정
값 즉시 지정방식 1010H + 203CH의 예 1 ;값 즉시 지정방식의 예 2 MAIN SEGMENT 3 ASSUME CS:MAIN, DS:MAIN 4 MOV AX, CS 5 MOV DS, AX 6 MOV AX, 1010H
값 즉시 지정방식 7 ADD AX, 203CH 8 MOV RESULT, AX 9 MOV AH, 4CH 10 INT 21H 11 RESULT DW ? 12 MAIN ENDS 13 END
실행전의 기억장소 상태 0A5C : 0000 0A5C : 0002 0A5C : 0004 0A5C : 0007 0A5C : 000D 0A5C : 000F 0A5C : 0011 0A5C : 0013 MOV AX, CS MOV DS, AX MOV AX, 1010 ADD AX, 203C MOV [0011] , AX MOV AH, 4C INT 21 00 00
실행후의 기억장소 상태 0A5C : 0000 0A5C : 0002 0A5C : 0004 0A5C : 0007 0A5C : 000D 0A5C : 000F 0A5C : 0011 0A5C : 0013 MOV AX, CS MOV DS, AX MOV AX, 1010 ADD AX, 203C MOV [0011] , AX MOV AH, 4C INT 21 4C 30
레지스터 직접지정방식 MOV AL,BL AH AL AX 86 BL의 내용이 AL에 이동된다 BH BL BX 86
메모리 직접지정방식 데이터세그먼트 + DS 1010 AX B437 MOV AX,[0020] ×16 10100 10120 37 10121 B437 B4
직접주소지정의 실행과정 AX 1010 + AX 304C MOV AX,DATA1 ADD AX,DATA2 0012 0014 10 1427:0012 DATA1 1427:0014 DATA2 1427:0016 RESULT 1427:0018 10 10 3C 20 0016 4C 30 MOV RESULT, AX
DATA1,DATA2에 저장된 값의 합 1 ;값 주소지정방식 예제 2 MAIN SEGMENT 3 ASSUME CS:MAIN, DS:MAIN 4 MOV AX, CS 5 MOV DS, AX 6 MOV AX, DATA1 7 ADD AX, DATA2
DATA1,DATA2에 저장된 값의 합 8 MOV RESULT, AX 9 MOV AH, 4CH 10 INT 21H 11 DATA1 DW 1010H 12 DATA2 DW 203CH 13 RESULT DW ? 14 MAIN ENDS 15 END
간접 주소지정의 유효주소 유효주소(EA) = BR + INX + D * BR:베이스 레지스터(BX,BP) * INX:인덱스 레지스터(SI,DI) * D:변위 - 레지스터 간접지정 : BR - 베이스 주소 지정 : BR, D - 인덱스 주소 지정 : INX, D - 베이스 인덱스 주소 지정 : BR,INX,D
8086 명령어의 형태 d는 레지스터의 방향 w는 바이트 또는 워드인지 결정 mod는 레지스터 또는 메모리 결정 3 byte 4 byte 1byte 5 byte 2byte 6 byte 7 6 5 4 3 2 1 7 6 5 4 3 2 1 변위 데이터 명령코드 d w mod reg r/m
MOV AL, CL 100010 1 0 11 000 001
주소지정방식 요약 주소지정방식의 이해 실행전·후의 기억장소 상태 이해 유효주소 생성의 이해 8086 명령어의 내용 이해
간접 주소지정 방식 레지스터 간접주소지정과 예 베이스 주소지정과 예 인덱스 주소지정과 예 베이스 인덱스 주소지정과 예
레지스터 간접 주소지정 ①LEA BX,DATA1 ②MOV AX,[BX] 0018 0018 BX 0018 0018 001A 001C AX 1010 10 10 3C 20
레지스터 간접 주소지정의 예 DATA1 + DATA2의 계산 1 ;레지스터 간접 주소지정 예 2 MAIN SEGMENT 3 ASSUME CS:MAIN, DS:MAIN 4 MOV AX, CS 5 MOV DS, AX 6 LEA BX, DATA1 7 MOV AX, [BX] 8 LEA BX, DATA2
레지스터 간접 주소지정의 예 9 ADD AX, [BX] 10 MOV RESULT, AX 11 MOV AX, 4CH 12 INT 21H 13 DATA1 DW 1010H 14 DATA2 DW 203CH 15 RESULT DW ? 16 MAIN ENDS 17 END
베이스 주소지정 방식 MOV AX, [BX] ADD AX, [BX+2] BX 0014 + AX 304C 0A5C:0014 DATA 0A5C:0016 0A5C:0018 RESULT 0A5C:0020 10 10 1010 3C 20 203C AX 304C 4C 30 MOV RESULT, AX
베이스 주소지정의 예 1 ;베이스 주소지정의 예 2 MAIN SEGMENT 3 ASSUME CS:MAIN, DS:MAIN 4 MOV AX, CS 5 MOV DS, AX 6 LEA BX, DATA 7 MOV AX, [BX]
베이스 주소지정의 예 8 ADD AX, [BX+2] 9 MOV RESULT, AX 10 MOV AH, 4CH 11 INT 21H 12 DATA DW 1010H, 203CH 13 RESULT DW ? 14 MAIN ENDS 15 END
인덱스 주소지정 방식 + AL 34 DI 0002 MOV DI, 2 MOV AL, DATA [DI] 0020 10 40 34 0A5C:0020 DATA 0A5C:0021 0A5C:0022 + 10 40 34 23 AL 34 ... DI 0002
인덱스 주소지정의 예 3월분→DATA1, 10월분→DATA2 1 ;인덱스 주소지정의 예 2 MAIN SEGMENT 3 ASSUME CS:MAIN, DS:MAIN 4 MOV AX, CS 5 MOV DS, AX 6 MOV DI, 2 7 MOV AL, DATA[DI]
인덱스 주소지정의 예 8 MOV DATA1, AL 9 MOV DI, 9 10 MOV AL, DATA[DI] 12 MOV AH, 4CH 13 INT 21H 14 DATA DB 10 ; 1월 15 DB 40 ; 2월
인덱스 주소지정의 예 16 DB 34 ; 3월 ... 23 DB 26 ;10월 26 DATA1 DB ? 28 MAIN ENDS 29 END
베이스 인덱스 주소지정 방식 DI 0002 + BX 001A AX 0014 2 4 TABLE1 TABLE2 10 20 30 TABLE1 TABLE2 10 20 30 40 50 60 BX 레지스터의 값 LEA BX, TABLE1 0A5C:001A TABLE1 0A5C:001C 0A5C:001E 0A5C:0020 TABLE2 0A5C:0022 0A 00 MOV AX, [BX][DI] 14 00 1E 00 DI 0002 + 28 00 BX 001A AX 0014 32 00
베이스 인덱스 주소지정의 예 1 ;베이스 인덱스 주소지정의 예 2 MAIN SEGMENT 3 ASSUME CS:MAIN, DS:MAIN 4 MOV AX, CS 5 MOV DS, AX 6 MOV DI, 2 7 LEA BX, TABLE1 8 MOV AX, [BX][DI] 9 LEA BX, TABLE2
베이스 인덱스 주소지정의 예 10 ADD AX, [BX][DI] 11 MOV RESULT, AX 12 MOV AH, 4CH 13 INT 21H 14 TABLE1 DW 10, 20, 30 15 TABLE2 DW 40, 50, 60 16 RESULT DW ? 17 MAIN ENDS 18 END
주소지정방식 요약 레지스터 간접주소지정의 이해 인덱스 주소지정의 이해 베이스 주소지정의 이해 베이스 + 인덱스결합 주소지정의 이해
ML 사용법 ML options filename.asm ML/Fl filename.asm : .lst .obj .exe MSAM + LINK : .obj, .exe ML/Fl filename.asm : .lst .obj .exe ML/Fm filename.asm : .map .obj .exe
assemble -> link -> execute 과정 library loader linker source file object file executable file output listing file map file text editor
ML/Fl tt.asm ML/Fl 사용법(tt.asm) LEA BX, DATA1 MAIN SEGMENT MOV AX, [BX] ASSUME CS:MAIN,DS:MAIN MOV AX,MAIN MOV DS,AX MOV AX,203CH MOV AL,CL LEA BX, DATA1 MOV AX, [BX] MOV AH,4CH INT 21H DATA1 DW 1010H MAIN ENDS END ML/Fl tt.asm
ML/Fl 사용법(tt.lst) 0000 MAIN SEGMENT ASSUME CS:MAIN, DS:MAIN 0000 B8 ---- R MOV AX,MAIN 0003 8E D8 MOV DS,AX 0005 B8 203C MOV AX,203CH 0008 8A C1 MOV AL,CL 000A 8D 1E 0014 R LEA BX, DATA1 000E 8B 07 MOV AX, [BX] 0010 B4 4C MOV AH,4CH 0012 CD 21 INT 21H 0014 1010 DATA1 DW 1010H 0016 MAIN ENDS END
XCHG(exchange data) XCHG reg,reg XCHG reg,mem XCHG mem,reg Two memory operands cannot be used together
XLAT 메모리내의 테이블로부터 데이터 로드 XLAT [tablename] lea bx, MyTable; 테이블의 위치 mov al,index ; 상대주소값을 al로 XLAT MyTable ; 값은 al 레지스터로
INC,DEC INC : increment , inc destination DEC : decrement , dec destination destination can be a register or memory operand
ADD,SUB ADD dest,src ; dest = dest + src SUB dest,src ; dest = dest - src The sizes of two operands must match only one can be a memory operand segment register cannot be the dest. add ax, word PTR temp
MUL,IMUL MUL : unsigned int, IMUL : signed int mul [reg | mem] ; 상수는 올 수 없다. 바이트 피연산자: AX = AL * 바이트 워드 피연산자 : DX:AX = AX * 워드
MUL,IMUL ex) 2000h * 10h = 20000h .data val1 dw 2000h val2 dw 0010h .code mov ax,val1 mul val2 ; dx = 0002h, ax=000h
DIV,IDIV DIV : unsigned int, IDIV : signed int DIV [reg | mem] ; 상수는 올 수 없다. 바이트 피연산자 AX / 바이트 > AL (몫), AH(나머지) 워드 피연산자 DX:AX / 워드 > AX(몫), DX(나머지)
DIV,IDIV ex) 8003h / 100h = 80h …3 mov dx,0 mov ax, 8003h mov cx,100h div cx ; ax = 0080h, dx = 0003h
LOOP loop : 조건 + jmp cx 값을 하나씩 줄여 나가면서 반복 수행 cx 값이 0 이면 그 다음 수행 mov cx,100 next: … … loop next
STACK LIFO(Last In First Out)방식을 취하는 메모리 상위메모리부터 저장 Each 16-bit location on the stack is pointed to by the SP register push(add), pop(remove)
PUSH,POP PUSH 명령어는 2바이트의 피연산자를 스택에 저장(SP는 2바이트씩 감소) POP 명령은 가장 마지막으로 넣은 값을 꺼내온다(SP는 2바이트씩 증가) CS,IP는 사용되어 질 수 없다.
STACK 예 mov cx,9 outer … push cx mov cx,20 inner … loop inner pop cx … loop outer
PUSHA,POPA 모든 레지스터를 스택에 저장,꺼냄 프로시져 호출 전/후에 주로 사용 프로시져에서 레지스터의 값 변경을 막기 위해서 사용 80286 이상에서 사용 ax,cx,dx,bx,sp,bp,si,di 순으로 저장
Procedure 어떤 특정한 과정을 처리하기 위해 메인 루틴과는 별도로 작성한 Subroutine CALL procedure_name name PROC [NEAR] 또는 name PROC FAR … RET name ENDP
NEAR,FAR Default : NEAR NEAR로 정의된 proc. 같은 세그먼트 내에 위치(IP만 스택에 저장) FAR로 정의된 proc. 다른 코드 세그먼트 에서도 참조 가능(CS,IP 스택에 저장)
Procedure 예 sseg SEGMENT para stack 'stack' db 64 DUP('stack') sseg ENDS dseg SEGMENT para public 'data' buffer db 16 dup(' ') ; buffer to hold chars bufferEnd label byte ; mark end of buffer xtable db '0123456789ABCDEF' ; translate table dseg ENDS
Procedure 예 MAIN SEGMENT para public 'code' ASSUME CS:MAIN, DS:dseg, ss:sseg MMAIN PROC FAR MOV AX,dseg MOV DS,AX mov ax, 5050 mov bx, 10 call Writeint MOV AH,4CH INT 21H MMAIN ENDP
Writeint proc mov cx,0 mov di, offset bufferEnd L3: mov dx,0 ; clear dividend to zero div bx ; divide AX by the radix xchg ax,dx ; exchange quotient, remainder push bx mov bx,offset xtable; translate table xlat ; look up ASCII digit pop bx dec di ; back up in buffer mov [di],al ; move digit into buffer xchg ax,dx ; swap quotient into AX inc cx ; increment digit count or ax,ax ; quotient = 0? jnz L3 ; no: divide again
; Display the buffer using CX as a counter. L4: mov ah,2 ; function: display character mov dl,[di] ; character to be displayed int 21h ; call DOS inc di ; point to next character loop L4 ret Writeint endp MAIN ENDS END MMAIN