Download presentation
Presentation is loading. Please wait.
1
제4장 어셈블리어
2
학습내용 프로그래밍 언어 어셈블리어 개요 어셈블리 프로그래밍 MASM 사용법
3
프로그래밍언어 계층
4
고급언어와 어셈블리어 예 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
5
원시프로그램의 번역 과정 보조기억장치 주기억장치 운영체제 원시코드 컴파일러 프로 세서 목적코드 목적코드
6
고급언어와 저급언어에서 번역 고급언어 사용 저급언어 사용 원시 코드 원시 코드 목적 코드 목적 코드 자연어 고급 언어 저급
프로그래밍 (동일, 작성용이) 프로그래밍 (기종마다 상이) (작성난해) 원시 코드 고급 언어 :1개 명령어 원시 코드 저급 언어 :1개 명령어 컴파일러 (복잡, 느림) 어셈블러 (간단, 빠름) 목적 코드 목적 코드 기계어 :N개 명령어 :1개 명령어 마이크로 코드 (전기회로의 동작상태 기술)
7
고급언어와 어셈블리어 고급언어 자연어와 가깝다 컴퓨터 동작에 대하여 알 필요가 없다 하나의 명령어는 다수의 기계어로 번역
프로세서에 호환 (컴파일러는 상이) 프로그램 이해가 용이하고 배우기 쉽다
8
고급언어와 어셈블리어 어셈블리어 기계어에 가깝다(대표적인 저급언어) 컴퓨터의 각 장치들의 구체적 동작 제어
기계어 하나에 하나의 니모닉 명령어 프로세서 마다 따로 정의 프로그램이 난해하며 배우기 힘들다 빠른 속도 주로 시스템 프로그래밍에 사용 하드웨어 이해에 적합
9
수행문 종류 어셈블리 지시어 어셈블리 명령어 주석문
컴퓨터가 무엇을 하도록 지시하는 것이 아니고 어셈블러에 대한 지시 사항을 전달 기계어로 번역되지 않는다 어셈블리 명령어 컴퓨터로 하여금 무엇을 수행하라고 직접 명령 기계어로 번역 주석문 ;기호 이후의 문장
10
어셈블리 지시어 데이터 관련 지시어 데이터 정의(DB, DW, DD, DT) 심볼 정의(EQU, =)
프로그램 출력 지시어 PAGE [lines] [,columns] ; 프린트 될 페이지 결정 lines : 10~255 , default : 57 columns : 60~132, default : 80 TITLE text(임의의 문장) SUBTTL text(임의의 문장) 프로세서 관련 지시어 어떤 프로세서에서 쓰이는 명령어인지 어셈블러에게 지시 Default : .8086 데이터 관련 지시어 데이터 정의(DB, DW, DD, DT) 심볼 정의(EQU, =) 외부 프로그램 참조(PUBLIC, EXTRN, ICLUDE) 영역 정의(SEGMENT, ASSUME, PROC) 어셈블리 제어(END, EVEN, ORG)
11
명령어 구성 [Label:] Mnemonic [Operand] [;Comment] 빈칸을 이용하여 구분
레이블은 하나의 어셈블리 명령어에 대하여 어떤 이름을 부여하는 것 다른 명령어는 그 이름을 사용하여 연관된 어셈블리 명령 참조 31문자까지 가능, 콜론(:)으로 끝난다. 알파벳, 숫자, 첫 문자로 숫자는 사용하지 않음, 마침표 사용시 반드시 첫자리에 레지스터 이름은 쓰지 않는다 (예약어 사용금지).
12
명령어 구성 연상코드(Mnemonic): 명령어 실행 내용을 나타냄 연산항(Operand): 명령어에 따라 상이
명령어가 작용하는 레지스터나 기억 장소의 위치 두개 일 때 앞의 것은 목적지 연산항 뒤의 것은 출발지 연산항
13
명령어 형식 연산항을 갖지 않는 명령어 * CLC ;캐리플래그를 0으로 함 하나의 연산항을 갖는 명령어
* DEC CX ;CX 레지스터의 값을 하나줄임 두개의 연산항(출발항, 목적항)을 갖는 명령어 * MOV AX, BX ;BX값을 AX로 옮김
14
MOV 명령어 (2개의 연산항 이용) MOV AL,BL MOV AX,BX 1 2 3 4 BX 실 행 전 1 2 3 4 출발항
BX 실 행 전 출발항 BX BH BL BH BL 목적항 AX AX AH AL AH AL 출발항 BX 실 행 후 BX BH BL BH BL 목적항 AX AX AH AL AH AL
15
MOV <operand1>, <operand2>
직 접 간접: 메모리 주소 도착항 operand1 값 범용 reg. 세그먼트 reg. 범용 reg. 세그먼트 reg. (CS는 제외) 간접:메모리주소 ○ × ○ ○ × ○ ×
16
프로그램의 기본형태 MAIN SEGMENT ASSUME CS:MAIN 프로그램 블록 MAIN ENDS END
17
문자 A를 출력하는 프로그램 (4-1) 1 MAIN SEGMENT ;MAIN 세그먼트 시작
주석문 vs 지시어 vs 명령어 1 MAIN SEGMENT ;MAIN 세그먼트 시작 ASSUME CS : MAIN ;코드 세그먼트 지정 MOV DL, ‘A’ ;출력할 문자 저장 MOV AH, 2 ;콘솔로 문자 출력 INT 21H ;AH(수행할 명령)값에 따라 ;기능 수행 MOV AH, 4CH ;DOS 프롬프트 복귀(종료) INT 21H ;DOS 인터럽트 시스템 호출 8 MAIN ENDS ;MAIN 세그먼트 끝 END ;프로그램 종료
18
문자 A를 출력하는 프로그램 MAIN SEGMENT 세그먼트의 이름을 ‘MAIN’으로 한다는 선언문
ASSUME CS : MAIN MAIN은 코드 세그먼트, MAIN내의 레이블을 참조할 때는 CS 레지스터로부터 세그먼트의 주소를 얻어서 사용하라는 지시어 MAIN ENDS MAIN 세그먼트 끝을 나타내는 지시어 END 프로그램의 끝을 나타내는 지시어
19
문자 A를 출력하는 프로그램 MOV DL, ‘A’ 출력할 문자를 DL 레지스터로 전송하라는 명령어 MOV AH, 2
INT 21H AH 레지스터에 저장된 명령코드에 따라 기능(부록 F) 수행 MOV AH, 4CH DOS 프롬프트 복귀 하라는 의미의 명령코드 ’4Ch’를 AH 레지스터로 전송하라는 명령어
20
프로그램 실행 번역: masm filename 프로그램을 ex4-2.asm으로 저장했다면… masm ex4-2.asm
링크: link filename ex4-2.asm을 번역하고 나면 ex4-2.obj 파일이 생성… link ex4-2 실행: filename ex4-2.obj 파일을 링크하고 나면 ex4-2.exe 파일이 생성… ex4-2
21
상수 정수 문자상수 실수: 12.34, 1.234E1 표시는 대문자 또는 소문자(2:b; 8:o,q; 10:d; 16:h)
16진법 첫 숫자는 반드시 아라비아 숫자 abcH 0abcH 16진법에서 A,B,C,D,E,F는 대/소문자 아무 표시가 없으면 10진수 문자상수 ‘A’ ‘AB’ ‘Can’’t’ “Can’t” 실수: 12.34, 1.234E1 DD, DQ, DT에 의해서만 정의가능 실수 자체가 명령어에서 직접 사용되지는 않는다.
22
상수 정의 레이블 EQU 상수[식] 레이블 = 상수[식] EQU 사용시 한번 정의된 레이블은 재정의가 불가
레이블 = 상수[식] EQU 사용시 한번 정의된 레이블은 재정의가 불가 SUM EQU 2FFh XT = ‘Z’ SUM EQU 3FAh ;재정의 불가능, 오류발생 XT = ‘Y’ ;재정의 가능
23
변수 정의 DB : 1 바이트 이상의 메모리 할당 DW : 워드 (2바이트) 메모리 할당
DD : 2워드 (4바이트) 메모리 할당 DQ : 4워드 (8바이트) 메모리 할당 DT : 10 바이트 메모리 할당 [레이블] DB expression[,반복]
24
변수 정의 max DB 255 wmax DW 65535 table DB 0,1,2 table DB 0 DB 1 DB 2
table DW 3, 3, 3, 3, 8, 7, 7, 7 table DW 4 DUP(3), 8, 3 DUP(7) temp DB ? temp1 DW 12 DUP(?) 문자는 DB 사용 : msg DB ‘abcabc’ msg DB 2 DUP(‘abc’)
25
어셈블리어… 문법 여러 프로그램을 연결 편집하여 하나의 수행 가능한 프로그램을 만들 때 각각의 프로그램 간에 서로 정보를 주고 받아야 한다. PUBLIC symbol[,…] 외부 사용자가 이 프로그램을 사용해도 좋다 EXTERN name : type[, …] 다른 곳에서 정의된 것을 사용하겠다 type : byte, word, dword, NEAR, FAR, ABS(EQU, =) SEGMENT 프로그램의 영역을 구분하는데 사용 세그먼트란 한 세그먼트 레지스터 내의 주소를 참조 함으로서 찾아갈 수 있는 모든 명령문과 데이터의 집합 s_name SEGMENT … s_name ENDS ENDS ASSUME ASSUME s_reg : s_name END [entry_point name] 원시 프로그램의 끝을 정의 EVEN 메모리 주소를 짝수에 위치 시킴 산술연산자(+,-,*,/,MOD,SHL,SHR) / : 몫, MOD: 나머지 abc EQU B 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가 저장 아니면 0
26
순차적 실행 프로그램을 저장된 순서대로 실행 분기: 실행순서를 변경 BIU는 IP에 있는 내용을 주소버스로 출력
주소가 가리키는 기억장소에서 명령어를 인출하여 명령어 큐에 저장 EU에서 명령어를 명령어 큐로부터 읽어와서 해독 명령어 실행 IP 증가 (다음 명령어를 가리키도록) 분기: 실행순서를 변경
27
조건 분기 Jcc <분기되어 갈 주소> Cc에 올 수 있는 문자
28
조건 분기 명령의 예 CMP AX,100 JA Loop1 * if AX>100 then Loop1으로 분기 JE Loop2
CMP A, B ; A-B 값을 이용하여 플래그 레지스터의 비트를 세팅
29
명령어의 조건 분기 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의 수가 짝수개 올림수 발생 결과의 범위초과 CX 레지스터가 0일 때만 분기
30
1~100 합을 구하는 프로그램 (4-2) 1 MAIN SEGMENT 2 ASSUME CS:MAIN, DS:MAIN
MOV AX, CS MOV DS, AX MOV CX, 1 MOV AX, 0 7 LOOP1: ADD AX, CX INC CX LOOP1: 표지기호(label), 특정 명령어가 있는 주소에 붙여지는 이름
31
ADD와 INC 명령어 ADD <operand 1>, <operand 2>
ADD [BX], 20h ; BX에는 주소가 저장되어 있음 ADD BYTE PTR [BX], 20h ; BX가 가리키는 곳의 메모리를 바이트로 재정의 INC <operand>, DEC <operand> INC CX ; CX 레지스터의 값을 하나 증가 DEC CX ; CX 레지스터의 값을 하나 감소
32
1~100 합을 구하는 프로그램 (4-2) CMP CX, 100 JBE LOOP1 ; IF CX-100 <= 0, GOTO LOOP1 MOV SUM, AX MOV AH, 4CH INT H 14 SUM DW ? 15 MAIN ENDS END
33
무조건 분기 기억장치 IP N JMP OVER . N-2 N IP = IP + d d =OVER - N OVER
변위(d: displacement)
34
소문자를 대문자로 변환 (4-3) 1 MAIN SEGMENT 2 ASSUME CS:MAIN 3 L1: MOV AH, 1
INT H CMP AL, 1AH ;1AH = ^Z JE FIN CMP AL, ‘a’ ;IF AL – ‘a’ >= 0 JB L2 CMP AL, ‘z’ ;IF AL – ‘z’ >= 0
35
소문자를 대문자로 변환 10 JA L2 11 SUB AL, ‘a’ - ‘A’ ;AL = AL – 20h
12 L2: MOV DL, AL MOV AH, 2 INT H JMP L1 ;L1으로 무조건 분기 16 FIN: MOV AH, 4CH INT H 18 MAIN ENDS END
36
SUB 명령어 SUB <operand 1>, <operand 2>
SUB AL, 20h ; AL에 저장되어 있는 값에서 20h를 뺀 후 이 값을 다시 AL에 저장
37
주소 지정방식(데이터 지정방식) 값 즉시 지정: 8 또는 16비트 값 직접 이용
직접 주소 지정: 레지스터 또는 기억장치주소가 저장하고 있는 값 직접 이용 레지스터 직접, 메모리 직접 간접 주소 지정: 레지스터가 가리키는 주소에 있는 값 간접이용 (주소를 만든 방식에 따라 분류) * 레지스터 간접 주소지정 * 베이스 주소지정 * 인덱스 주소지정 * 베이스 인덱스 주소지정
38
값 즉시 지정방식 연산항에 레지스터나 기억장소의 주소가 아닌 8비트 또는 16비트의 숫자를 직접 오게 하는 방법
39
값 즉시 지정방식 (4-4) 1010H + 203CH의 예 1 ;값 즉시 지정방식의 예 2 MAIN SEGMENT
ASSUME CS:MAIN, DS:MAIN MOV AX, CS MOV DS, AX MOV AX, 1010H
40
값 즉시 지정방식 7 ADD AX, 203CH 8 MOV RESULT, AX 9 MOV AH, 4CH 10 INT 21H
11 RESULT DW ? 12 MAIN ENDS END
41
실행전의 기억장소 상태 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
42
실행후의 기억장소 상태 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 11번지 30 12번지
43
LST 파일
44
레지스터 직접지정방식 AH AL AX 86 BL의 내용이 AL에 이동된다 BH BL BX 86 MOV AL,BL
레지스터에 저장되어 있는 값을 그대로 이용 MOV AL,BL AH AL AX 86 BL의 내용이 AL에 이동된다 BH BL BX 86
45
메모리 직접지정방식 기억장치주소에 저장되어 있는 값을 그대로 이용 MOV AX,[0020] 데이터세그먼트 ×16 1010 +
DS 1010 + 10100 10120 37 AX B437 10121 B4
46
DATA1,DATA2에 저장된 값의 합 (4-5) 1 ;값 주소지정방식 예제 2 MAIN SEGMENT
ASSUME CS:MAIN, DS:MAIN MOV AX, CS MOV DS, AX MOV AX, DATA1 ADD AX, DATA2
47
DATA1,DATA2에 저장된 값의 합 (4-5) 8 MOV RESULT, AX 9 MOV AH, 4CH 10 INT 21H
11 DATA1 DW H 12 DATA2 DW CH 13 RESULT DW ? 14 MAIN ENDS END
48
직접주소지정의 실행과정 AX 1010 + AX 304C MOV AX, DATA1 ADD AX, DATA2 0012 0014
1427:0012 DATA1 1427:0014 DATA2 1427:0016 RESULT 1427:0018 10 10 3C 20 0016 4C 30 MOV RESULT, AX
49
실행전의 기억장소 상태 0A5C : 0000 0A5C : 0002 0A5C : 0004 0A5C : 0007
0A5C : 000B 0A5C : 000E 0A5C : 0010 0A5C : 0012 0A5C : 0014 0A5C : 0016 0A5C : 0018 MOV AX, CS MOV DS, AX MOV AX, [0012] ADD AX, [0014] MOV [0016] , AX MOV AH, 4C INT 21 10 10 3C 20 00 00
50
실행후의 기억장소 상태 0A5C : 0000 0A5C : 0002 0A5C : 0004 0A5C : 0007
0A5C : 000B 0A5C : 000E 0A5C : 0010 0A5C : 0012 0A5C : 0014 0A5C : 0016 0A5C : 0018 MOV AX, CS MOV DS, AX MOV AX, [0012] ADD AX, [0014] MOV [0016] , AX MOV AH, 4C INT 21 10 10 3C 20 4C 30
51
간접 주소지정의 유효주소 유효주소(EA) = BR + INX + D * BR: 베이스 레지스터(BX, BP)
* INX: 인덱스 레지스터(SI, DI) * D: 변위(8비트 또는 16비트 상수값) - 레지스터 간접지정: BR - 베이스 주소 지정: BR, D - 인덱스 주소 지정: INX, D - 베이스 인덱스 주소 지정: BR, INX, D
52
8086 명령어의 형태 어셈블리 명령어 기계어 d는 레지스터의 방향 w는 바이트 또는 워드인지 결정
mod & r/m은 레지스터 또는 메모리 결정 reg는 조작에 쓰이는 레지스터 결정 1byte 2byte 3byte 4byte 5byte 6byte 7 6 5 4 3 2 1 7 6 5 4 3 2 1 immed -low immed -high disp -low disp -high 명령코드 d w mod reg r/m 상수항 변위
53
mod, r/m 필드의 의미
54
reg, seg 필드의 의미
55
레지스터 간접 주소지정 방식 지정된 베이스 레지스터 또는 인덱스 레지스터의 값이 유효주소가 됨 [BR]
[레지스터 이름]: []는 주소가 나타내는 값을 의미함
56
레지스터 간접 주소지정의 예 (4-6) DATA1 + DATA2의 계산 1 ;레지스터 간접 주소지정 예
2 MAIN SEGMENT ASSUME CS:MAIN, DS:MAIN MOV AX, CS MOV DS, AX LEA BX, DATA1 ;DATA1의 유효주소를 BX에 저장 MOV AX, [BX] LEA BX, DATA2
57
레지스터 간접 주소지정의 예 (4-6) 9 ADD AX, [BX] 10 MOV RESULT, AX 11 MOV AX, 4CH
INT 21H 13 DATA1 DW H 14 DATA2 DW CH 15 RESULT DW ? 16 MAIN ENDS END
58
레지스터 간접 주소지정 ①LEA BX,DATA1 ②MOV AX,[BX] 0018 0018 BX 0018 0018 001A 001C AX 1010 10 10 3C 20
59
실행전후의 기억장소 상태
60
베이스 주소지정 방식 지정된 베이스 레지스터의 값과 변위 값을 합하여 유효주소를 계산 [BR + D]
[레코드의 시작위치 + 특정 필드까지의 거리]
61
베이스 주소지정의 예 (4-7) 1 ;베이스 주소지정의 예 2 MAIN SEGMENT
ASSUME CS:MAIN, DS:MAIN MOV AX, CS MOV DS, AX LEA BX, DATA MOV AX, [BX]
62
베이스 주소지정의 예 (4-7) 8 ADD AX, [BX+2] 9 MOV RESULT, AX 10 MOV AH, 4CH
INT H 12 DATA DW H, 203CH 13 RESULT DW ? 14 MAIN ENDS END
63
베이스 주소지정 방식 MOV AX, [BX] ADD AX, [BX+2] BX 0014 + 304C AX
0A5C:0014 DATA 0A5C:0016 0A5C:0018 RESULT 0A5C:0020 10 10 1010 3C 20 203C 304C AX 4C 30 MOV RESULT, AX
64
실행전후의 기억장소 상태
65
인덱스 주소지정방식 변위값에 인덱스 레지스터의 값을 합하여 유효주소를 계산 D[INX] : 유효주소 = D + INX
배열의 시작위치[특정 요소까지의 거리]
66
인덱스 주소지정의 예 (4-8) 3월분→DATA1, 10월분→DATA2 1 ;인덱스 주소지정의 예 2 MAIN SEGMENT
ASSUME CS:MAIN, DS:MAIN MOV AX, CS MOV DS, AX MOV DI, 2 MOV AL, DATA[DI]
67
인덱스 주소지정의 예 8 MOV DATA1, AL 9 MOV DI, 9 10 MOV AL, DATA[DI]
MOV AH, 4CH INT H 14 DATA DB ; 1월 DB ; 2월
68
인덱스 주소지정의 예 16 DB 34 ; 3월 ... 23 DB 26 ;10월 26 DATA1 DB ?
28 MAIN ENDS END
69
인덱스 주소지정 방식 + 34 AL 0002 DI MOV DI, 2 MOV AL, DATA [DI] 0020 10 40 34
0A5C:0020 DATA 0A5C:0021 0A5C:0022 + 10 40 34 23 AL 34 0002 ... DI
70
LST 파일 22h 1Ah 실행후
71
베이스 인덱스 주소지정방식 지정된 베이스 레지스터의 값과 변위 값을 합한 값에 인덱스 레지스터의 값을 합하여 유효주소를 계산
[BR+D][INX] : 유효주소 = BR + D + INX 구조체와 같은 복잡한 자료의 표현을 위해 이용
72
베이스 인덱스 주소지정의 예 1 ;베이스 인덱스 주소지정의 예 2 MAIN SEGMENT
ASSUME CS:MAIN, DS:MAIN MOV AX, CS MOV DS, AX MOV DI, 2 LEA BX, TABLE1 MOV AX, [BX][DI] LEA BX, TABLE2
73
베이스 인덱스 주소지정의 예 10 ADD AX, [BX][DI] 11 MOV RESULT, AX 12 MOV AH, 4CH
INT H 14 TABLE1 DW , 20, 30 15 TABLE2 DW , 50, 60 16 RESULT DW ? 17 MAIN ENDS END
74
베이스 인덱스 주소지정 방식 0002 DI + 001A BX 0014 AX 2 4 TABLE1 TABLE2 10 20 30
2 4 DI 레지스터의 값 TABLE1 TABLE2 BX 레지스터의 값 LEA BX, TABLE1 0A5C:001A TABLE1 0A5C:001C 0A5C:001E 0A5C:0020 TABLE2 0A5C:0022 0A 00 MOV AX, [BX][DI] 14 00 0002 1E 00 DI + 28 00 BX 001A 0014 AX 32 00
75
LST 파일 0046h 실행후
76
MOV와 ADD 명령어의 코드 변환
77
MOV와 ADD 명령어의 코드 변환 값 즉시 지정방식 (Immediate to Register)
명령어 : MOV AX, 203Ch B8 20 3C : 코드 w reg = AX 20 3C
78
MOV와 ADD 명령어의 코드 변환 레지스터 직접지정 (Register to/from Register/Memory)
명령어 : MOV AL, CL 8A C1 : 코드 d w Mod = 직접 reg = AL r/m = CL To register (AL)
79
MOV와 ADD 명령어의 코드 변환 레지스터 간접지정 (Register to/from Register/Memory)
명령어 : MOV AX, [BX] 8A C1 : 코드 d w Mod = 간접 reg = AX r/m = [BX] To register (AX)
80
MASM MASM TEST.ASM LINK TEST TEST
81
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
82
assemble -> link -> execute 과정
library loader linker source file object file executable file output listing file map file text editor
83
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
84
ML/Fl 사용법(tt.lst) 0000 MAIN SEGMENT ASSUME CS:MAIN, DS:MAIN
0000 B R MOV AX,MAIN E D8 MOV DS,AX 0005 B8 203C MOV AX,203CH A 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 DATA1 DW 1010H MAIN ENDS END
85
XCHG(exchange data) XCHG reg,reg XCHG reg,mem XCHG mem,reg
Two memory operands cannot be used together
86
XLAT 메모리내의 테이블로부터 데이터 로드 XLAT [tablename] lea bx, MyTable; 테이블의 위치
mov al,index ; 상대주소값을 al로 XLAT MyTable ; 값은 al 레지스터로
87
INC,DEC INC : increment , inc destination
DEC : decrement , dec destination destination can be a register or memory operand
88
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
89
MUL,IMUL MUL : unsigned int, IMUL : signed int
mul [reg | mem] ; 상수는 올 수 없다. 바이트 피연산자: AX = AL * 바이트 워드 피연산자 : DX:AX = AX * 워드
90
MUL,IMUL ex) 2000h * 10h = 20000h .data val1 dw 2000h val2 dw 0010h
.code mov ax,val1 mul val2 ; dx = 0002h, ax=000h
91
DIV,IDIV DIV : unsigned int, IDIV : signed int
DIV [reg | mem] ; 상수는 올 수 없다. 바이트 피연산자 AX / 바이트 > AL (몫), AH(나머지) 워드 피연산자 DX:AX / 워드 > AX(몫), DX(나머지)
92
DIV,IDIV ex) 8003h / 100h = 80h …3 mov dx,0 mov ax, 8003h mov cx,100h
div cx ; ax = 0080h, dx = 0003h
93
LOOP loop : 조건 + jmp cx 값을 하나씩 줄여 나가면서 반복 수행 cx 값이 0 이면 그 다음 수행
mov cx,100 next: … … loop next
94
STACK LIFO(Last In First Out)방식을 취하는 메모리 상위메모리부터 저장
Each 16-bit location on the stack is pointed to by the SP register push(add), pop(remove)
95
PUSH,POP PUSH 명령어는 2바이트의 피연산자를 스택에 저장(SP는 2바이트씩 감소)
POP 명령은 가장 마지막으로 넣은 값을 꺼내온다(SP는 2바이트씩 증가) CS,IP는 사용되어 질 수 없다.
96
STACK 예 mov cx,9 outer … push cx mov cx,20 inner … loop inner pop cx …
loop outer
97
PUSHA,POPA 모든 레지스터를 스택에 저장,꺼냄 프로시져 호출 전/후에 주로 사용
프로시져에서 레지스터의 값 변경을 막기 위해서 사용 80286 이상에서 사용 ax,cx,dx,bx,sp,bp,si,di 순으로 저장
98
Procedure 어떤 특정한 과정을 처리하기 위해 메인 루틴과는 별도로 작성한 Subroutine
CALL procedure_name name PROC [NEAR] 또는 name PROC FAR … RET name ENDP
99
NEAR,FAR Default : NEAR NEAR로 정의된 proc. 같은 세그먼트 내에 위치(IP만 스택에 저장)
FAR로 정의된 proc. 다른 코드 세그먼트 에서도 참조 가능(CS,IP 스택에 저장)
100
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 ' ABCDEF' ; translate table dseg ENDS
101
Procedure 예 (AX 숫자 출력) 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
102
Writeint proc mov cx,0 mov di, offset bufferEnd L3: mov dx, ; 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 L ; no: divide again
103
; Display the buffer using CX as a counter.
L4: mov ah, ; 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
Similar presentations