b 1 c 2 a bc mov mov
고급언어와 어셈블리어 예 b =1; c= 2; a = b+c; mov mov add mov dword ptr eax, dword ptr [ebp-8], 1 [ebp-0 Ch], 2 ptr [ebp-8] ptr [ebp-0 Ch] [ebp-4], eax
2 개의 연산항을 갖는 명령어 MOV AL, BL 16 8 7 MOV AX, BX 16 0 8 7 출발항 BX 1 2 BH 목적항 AX 0 0 AH 3 4 BL 0 0 AL 실 행 전 BX 1 2 BH AX 0 0 AH 3 4 BL 0 0 AL 출발항 BX 1 2 BH 목적항 AX 0 0 AH 3 4 BL 3 4 AL 실 행 후 BX 1 2 BH AX 1 2 AH 3 4 BL 3 4 AL 0
데이터 정의 l l l l max DB 255 wmax DW 65535 table DB 0, 1, 2 table DB 0 DB 1 DB 2 table DB 3, 3, 8, table DB 4 DUP(3), 8, 3 temp DB ? temp 1 DW 12 DUP(? ) 문자는 DB 사용 : msg DB 7, 7, 7 DUP(7) “hello”
연산자 l 산술연산자(+, -, *, /, MOD, SHL, SHR) 4/ : 몫, MOD: 나머지 4 abc EQU 00110010 B SHL 2 4 def EQU abc SHR 2 l 논리연산자(AND, OR, XOR, NOT): 비트단위 l 관계연산자(EQ, NE, LT, GT, LE, GE) 4 mov ax, const EQ 20 4 const가 20이면 ax는 FFFFh가 저장
프로그램의 기본형태 MAIN SEGMENT ASSUME CS: MAIN 프로그램 블록 MAIN ENDS END
문자 A를 출력하는 프로그램 1 2 3 4 5 6 7 8 9 MAIN SEGMENT ASSUME CS : MAIN MOV DL, ‘A’ MOV AH, 2 INT 21 H MOV AH, 4 CH INT 21 H MAIN ENDS END
MASM TEST. ASM LINK TEST
조건적 분기 명령의 예 l CMP AX, 100 JA Loop 1 * if AX> 100 then Loop 1으로 분기 JE Loop 2 * if AX==100 then Loop 2로 분기
1~100 합을 구하는 프로그램 1 MAIN 2 3 4 5 6 7 LOOP 1: 8 SEGMENT ASSUME MOV MOV ADD INC CS: MAIN, DS: MAIN AX, CS DS, AX CX, 1 AX, 0 AX, CX CX
1~100 합을 구하는 프로그램 9 10 11 12 13 14 SUM 15 MAIN 16 CMP JBE MOV INT DW ENDS END CX, 100 LOOP 1 SUM, AX AH, 4 CH 21 H ?
소문자를 대문자로 변환 1 2 3 4 5 6 7 8 9 MAIN SEGMENT ASSUME L 1: MOV INT CMP JE CMP JB CMP CS: MAIN AH, 1 21 H AL, 1 AH FIN AL, ‘a’ L 2 AL, ‘z’
소문자를 대문자로 변환 10 11 12 13 14 15 16 17 18 19 JA SUB L 2: MOV INT JMP FIN: MOV INT MAIN ENDS END L 2 AL, DL, AH, 21 H L 1 AH, 21 H ‘a’-‘A’ AL 2 4 CH
값 즉시 지정방식 1 2 3 4 5 6 1010 H + 203 CH의 예 ; 값 즉시 지정방식의 예 MAIN SEGMENT ASSUME CS: MAIN, DS: MAIN MOV AX, CS MOV DS, AX MOV AX, 1010 H
값 즉시 지정방식 7 ADD 8 MOV 9 MOV 10 INT 11 RESULT DW 12 MAIN ENDS 13 END AX, 203 CH RESULT, AX AH, 4 CH 21 H ?
실행전의 기억장소 상태 0 A 5 C : 0000 0 A 5 C : 0002 0 A 5 C : 0004 0 A 5 C : 0007 0 A 5 C : 000 A 0 A 5 C : 000 D 0 A 5 C : 000 F 0 A 5 C : 0011 0 A 5 C : 0013 MOV AX, CS MOV DS, AX MOV AX, 1010 ADD AX, 203 C MOV [0011] , AX MOV AH, 4 C INT 21 00 00
실행후의 기억장소 상태 0 A 5 C : 0000 0 A 5 C : 0002 0 A 5 C : 0004 0 A 5 C : 0007 0 A 5 C : 000 A 0 A 5 C : 000 D 0 A 5 C : 000 F 0 A 5 C : 0011 0 A 5 C : 0013 MOV AX, CS MOV DS, AX MOV AX, 1010 ADD AX, 203 C MOV [0011] , AX MOV AH, 4 C INT 21 4 C 30
메모리 직접지정방식 l MOV DS 1010 AX B 437 AX, [0020] × 16 데이터세그먼트 + 10100 37 B 4 10120 10121
직접주소지정의 실행과정 MOV AX, DATA 1 AX 1010 AX 304 C 1427: 0012 DATA 1 1427: 0014 DATA 2 1427: 0016 RESULT 1427: 0018 + ADD AX, DATA 2 0014 10 10 3 C 20 4 C 30 0016 MOV RESULT, AX
DATA 1, DATA 2에 저장된 값의 합 1 ; 값 주소지정방식 예제 2 MAIN SEGMENT 3 ASSUME CS: MAIN, DS: MAIN 4 MOV AX, CS 5 MOV DS, AX 6 MOV AX, DATA 1 7 ADD AX, DATA 2
DATA 1, DATA 2에 저장된 값의 합 8 9 10 11 12 13 14 15 DATA 1 DATA 2 RESULT MAIN MOV INT DW DW DW ENDS END RESULT, AX AH, 4 CH 21 H 1010 H 203 CH ?
l MOV AL, CL l 100010 1 0 11 000 001
레지스터 간접 주소지정 ①LEA BX, DATA 1 ②MOV AX, [BX] 0018 BX 0018 AX 1010 0018 001 A 001 C 10 10 3 C 20
레지스터 간접 주소지정의 예 1 2 3 4 5 6 7 8 DATA 1 + DATA 2의 계산 ; 레지스터 간접 주소지정 예 MAIN SEGMENT ASSUME CS: MAIN, DS: MAIN MOV AX, CS MOV DS, AX LEA BX, DATA 1 MOV AX, [BX] LEA BX, DATA 2
레지스터 간접 주소지정의 예 9 10 11 12 13 14 15 16 17 ADD MOV INT DATA 1 DW DATA 2 DW RESULT DW MAIN ENDS END AX, [BX] RESULT, AX AX, 4 CH 21 H 1010 H 203 CH ?
베이스 주소지정 방식 MOV AX, [BX] ADD AX, [BX+2] BX 0014 0 A 5 C: 0014 DATA 0 A 5 C: 0016 0 A 5 C: 0018 RESULT 0 A 5 C: 0020 10 10 3 C 20 4 C 30 + 1010 203 C AX 304 C 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 9 10 11 12 13 14 15 ADD MOV INT DATA DW RESULT DW MAIN ENDS END AX, [BX+2] RESULT, AX AH, 4 CH 21 H 1010 H, 203 CH ?
인덱스 주소지정 방식 MOV DI, 2 MOV AL, DATA [DI] 0020 0 A 5 C: 0020 DATA 0 A 5 C: 0021 0 A 5 C: 0022 10 40 34 23. . . + AL 34 DI 0002
인덱스 주소지정의 예 1 2 3 4 5 6 7 3월분→DATA 1, 10월분→DATA 2 ; 인덱스 주소지정의 예 MAIN SEGMENT ASSUME CS: MAIN, DS: MAIN MOV AX, CS MOV DS, AX MOV DI, 2 MOV AL, DATA[DI]
인덱스 주소지정의 예 8 9 10 11 12 13 14 DATA 15 MOV MOV MOV INT DB DB DATA 1, AL DI, 9 AL, DATA[DI] DATA 2, AL AH, 4 CH 21 H 10 ; 1월 40 ; 2월
인덱스 주소지정의 예 16 DB. . . 23 DB. . . 26 DATA 1 DB 27 DATA 2 DB 28 MAIN ENDS 29 END 34 ; 3월 26 ; 10월 ? ?
베이스 인덱스 주소지정 방식 0 2 4 TABLE 1 10 20 30 TABLE 2 40 50 60 0 A 5 C: 001 A TABLE 1 0 A 5 C: 001 C 0 A 5 C: 001 E 0 A 5 C: 0020 TABLE 2 0 A 5 C: 0022 0 A 14 1 E 28 32 DI 레지스터의 값 BX 레지스터의 값 LEA BX, TABLE 1 00 MOV AX, [BX][DI] 00 00 DI 0002 + 00 BX 001 A 00 AX 0014
베이스 인덱스 주소지정의 예 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, TABLE 1 8 MOV AX, [BX][DI] 9 LEA BX, TABLE 2
베이스 인덱스 주소지정의 예 10 11 12 13 14 15 16 17 18 ADD MOV INT TABLE 1 DW TABLE 2 DW RESULT DW MAIN ENDS END AX, [BX][DI] RESULT, AX AH, 4 CH 21 H 10, 20, 30 40, 50, 60 ?
ML 사용법 l ML options filename. asm 4 MSAM + LINK : . obj, . exe l ML/Fl filename. asm : . lst. obj. exe l ML/Fm filename. asm : . map. obj. exe
assemble -> link -> execute 과 정 link library source file object file text editor listing file linker loader executable file map file output
ML/Fl 사용법(tt. asm) MAIN SEGMENT LEA BX, DATA 1 ASSUME CS: MAIN, DS: MAIN MOV AX, [BX] MOV AX, MAIN MOV AH, 4 CH INT 21 H MOV DS, AX MOV AX, 203 CH MOV AL, CL DATA 1 DW 1010 H MAIN ENDS END ML/Fl tt. asm
ML/Fl 사용법(tt. lst) 0000 MAIN SEGMENT ASSUME CS: MAIN, DS: MAIN 0000 B 8 ---- R 0003 8 E D 8 MOV AX, MAIN MOV DS, AX 0005 0008 000 A 000 E MOV LEA MOV B 8 8 A 8 D 8 B 203 C C 1 1 E 0014 R 07 0010 B 4 4 C 0012 CD 21 AX, 203 CH AL, CL BX, DATA 1 AX, [BX] MOV AH, 4 CH INT 21 H 0014 1010 DATA 1 DW 1010 H 0016 MAIN ENDS END
XCHG(exchange data) l XCHG reg, reg l XCHG reg, mem l XCHG mem, reg l Two memory operands cannot be used together
INC, DEC l INC : increment , inc destination l DEC : decrement , dec destination l destination can be a register or memory operand
ADD, SUB l ADD dest, src ; dest = dest + src l SUB dest, src ; dest = dest - src l The sizes of two operands must match l only one can be a memory operand l segment l add register cannot be the dest. ax, word PTR temp
MUL, IMUL ex) 2000 h * 10 h = 20000 h. data val 1 dw 2000 h val 2 dw 0010 h. code mov ax, val 1 mul val 2 ; dx = 0002 h, ax=000 h
DIV, IDIV ex) 8003 h / 100 h = 80 h … 3 mov dx, 0 mov ax, 8003 h mov cx, 100 h div cx ; ax = 0080 h, dx = 0003 h
STACK l LIFO(Last In First Out)방식을 취하는 메모리 l 상위메모리부터 l Each 저장 16 -bit location on the stack is pointed to by the SP register l push(add), pop(remove)
STACK 예 mov cx, 9 outer … push cx mov cx, 20 inner … loop inner pop cx … loop outer
Procedure l 어떤 특정한 과정을 처리하기 위해 메인 루틴과는 별도로 작성한 Subroutine l CALL procedure_name l name PROC [NEAR] 또는 name PROC FAR … … RET name ENDP
Procedure 예 sseg db sseg SEGMENT para stack 'stack' 64 DUP('stack') ENDS dseg SEGMENT para public 'data' buffer db 16 dup(' ') ; buffer to hold chars buffer. End label byte ; mark end of buffer xtable db '0123456789 ABCDEF' ; 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, 4 CH INT 21 H MMAIN ENDP
Writeint proc mov cx, 0 mov di, offset buffer. End L 3: 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 L 3 ; no: divide again
; Display the buffer using CX as a counter. L 4: mov ah, 2 ; function: display character mov dl, [di] ; character to be displayed int 21 h ; call DOS inc di ; point to next character loop L 4 ret Writeint endp MAIN ENDS END MMAIN
- Slides: 89