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
MOV 명령어 (2개의 연산항 이용) MOV AL, BL 16 출발항 BX 목적항 AX 8 7 MOV AX, BX 16 0 1 2 BH 0 0 AH 3 4 BL 0 0 AL 실 행 전 1 2 BH 0 0 AH 3 4 BL 3 4 AL 실 행 후 BX AX 8 7 0 1 2 BH 0 0 AH 3 4 BL 0 0 AL 1 2 BH 1 2 AH 3 4 BL 3 4 AL
프로그램의 기본형태 MAIN SEGMENT ASSUME CS: MAIN 프로그램 블록 MAIN ENDS END
변수 정의 l l l l max DB 255 wmax DW 65535 table DB 0, 1, 2 table DB 0 DB 1 DB 2 table DW 3, 3, 8, table DW 4 DUP(3), 8, 3 temp DB ? temp 1 DW 12 DUP(? ) 문자는 DB 사용 : msg DB 7, 7, 7 DUP(7) ‘abcabc’ 2 DUP(‘abc’)
1~100 합을 구하는 프로그램 (4 -2) 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 LOOP 1: 표지기호(label), 특정 명령어가 있는 주소에 붙여지는 이름
1~100 합을 구하는 프로그램 (4 -2) 9 10 11 12 13 14 SUM 15 MAIN 16 CMP JBE MOV INT DW ENDS END CX, 100 LOOP 1 ; IF CX-100 <= 0, GOTO LOOP 1 SUM, AX AH, 4 CH 21 H ?
무조건 분기 IP N IP = IP + d 기억장치 JMP OVER. . . N-2 N d =OVER - N OVER 변위(d: displacement)
소문자를 대문자로 변환 (4 -3) 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 ; 1 AH = ^Z FIN AL, ‘a’ ; IF AL – ‘a’ >= 0 L 2 AL, ‘z’ ; IF AL – ‘z’ >= 0
소문자를 대문자로 변환 10 11 20 h 12 L 2: 13 14 15 16 FIN: 17 18 MAIN 19 JA SUB L 2 AL, ‘a’ - ‘A’ ; AL = AL – MOV INT JMP MOV INT ENDS END DL, AL AH, 2 21 H L 1 ; L 1으로 무조건 분기 AH, 4 CH 21 H
값 즉시 지정방식 (4 -4) 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 11번지 12번지
DATA 1, DATA 2에 저장된 값의 합 (4 -5) 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에 저장된 값의 합 (4 -5) 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 ?
직접주소지정의 실행과정 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
실행전의 기억장소 상태 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 B 0 A 5 C : 000 E 0 A 5 C : 0010 0 A 5 C : 0012 0 A 5 C : 0014 0 A 5 C : 0016 0 A 5 C : 0018 MOV AX, CS MOV DS, AX MOV AX, [0012] ADD AX, [0014] MOV [0016] , AX MOV AH, 4 C INT 21 10 10 3 C 20 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 B 0 A 5 C : 000 E 0 A 5 C : 0010 0 A 5 C : 0012 0 A 5 C : 0014 0 A 5 C : 0016 0 A 5 C : 0018 MOV AX, CS MOV DS, AX MOV AX, [0012] ADD AX, [0014] MOV [0016] , AX MOV AH, 4 C INT 21 10 10 3 C 20 4 C 30
레지스터 간접 주소지정의 예 (4 -6) 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 ; DATA 1의 유효주소를 MOV AX, [BX] LEA BX, DATA 2 BX에 저장
레지스터 간접 주소지정의 예 (4 -6) 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 ?
레지스터 간접 주소지정 ①LEA BX, DATA 1 ②MOV AX, [BX] 0018 BX 0018 AX 1010 0018 10 001 A 3 C 001 C 10 20
베이스 주소지정의 예 (4 -7) 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]
베이스 주소지정의 예 (4 -7) 8 9 10 11 12 DATA 13 RESULT 14 MAIN 15 ADD MOV INT DW DW ENDS END AX, [BX+2] RESULT, AX AH, 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 3 C + 10 20 4 C 30 1010 203 C AX 304 C MOV RESULT, AX
인덱스 주소지정의 예 (4 -8) 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월 ? ?
인덱스 주소지정 방식 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 MAIN SEGMENT 3 ASSUME 4 MOV 5 MOV 6 MOV 7 LEA 8 MOV 9 LEA 주소지정의 예 CS: MAIN, DS: MAIN AX, CS DS, AX DI, 2 BX, TABLE 1 AX, [BX][DI] BX, TABLE 2
베이스 인덱스 주소지정의 예 10 11 12 13 14 15 16 17 18 TABLE 1 TABLE 2 RESULT MAIN ADD MOV INT DW DW DW ENDS END AX, [BX][DI] RESULT, AX AH, 4 CH 21 H 10, 20, 30 40, 50, 60 ?
베이스 인덱스 주소지정 방식 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
MOV와 ADD 명령어의 코드 변환 값 즉시 지정방식 (Immediate to Register) 명령어 : MOV AX, 203 Ch B 8 20 3 C : 1101 1000 0010 0000 0011 1100 코드 w reg = AX 20 3 C
MOV와 ADD 명령어의 코드 변환 레지스터 직접지정 (Register to/from Register/Memory) 명령어 : MOV AL, CL 8 A C 1 : 1000 1010 1100 0001 코드 d w Mod reg r/m = = = To register (AL) 직접 AL CL
MOV와 ADD 명령어의 코드 변환 레지스터 간접지정 (Register to/from Register/Memory) 명령어 : MOV AX, [BX] 8 A C 1 : 1000 1011 0000 0111 코드 d w Mod reg r/m = = = To register (AX) 간접 AX [BX]
MASM TEST. ASM LINK TEST
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 register cannot be the dest. l add 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 CALL procedure_name l name PROC [NEAR] 또는 name PROC FAR … … RET name ENDP l
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 예 (AX 숫자 출력) MAIN SEGMENT para public ASSUME CS: MAIN, DS: dseg, 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 'code' ss: sseg
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: 103