Lecture #8 어셈블리어 (5) - 8086 매크로 어셈블리어 시스템프로그래밍
반복 제어 명령(1) 반복 제어 명령 일련의 프로그램 코드를 반복적으로 수행하도록 제어하는 명령 예 1) 특정문자(‘ ‘)를 반복적으로 출력한다. 예 2) 1차원 배열의 원소의 합을 구한다. 예 3) 문자열을 다른 문자열로 전송한다. LOOP 명령 / String 명령 시스템프로그래밍
반복 제어 명령(2) LOOP 명령 카운터인 CX 레지스터 값이 0이 될 때까지 일련의 프로그램 코드를 반복적으로 실행하는 명령 C 언어의 for-loop 문장과 유사 CX 레지스터를 연산 카운터로 사용 문장 형식 : DEC CX CMP CX, 0 JNE NEXT MOV CX, 10 NEXT: . . LOOP NEXT 시스템프로그래밍
반복 제어 명령(3) 예제 프로그램 #1 1부터 10H 까지의 수치를 화면에 출력하는 프로그램 시스템프로그래밍 ; MODULE – PUTAL.SUB ; PUTAL: PUSH AX PUSH CX PUSH AX AND AL, 0F0H MOV CL, 4 SHR AL, CL CALL PUTHEX POP AX AND AL, 0FH POP CX RET ;--------------------------------------------------------- PUTHEX: PUSH AX PUSH DX MOV DL, AL CMP DL, 0AH JAE HEX2 ADD DL, ‘0’ JMP HEX3 HEX2: ADD DL, ‘A’-0AH HEX3: MOV AH, 2 INT 21H POP DX POP AX RET ;--------------------------------------------------------- 시스템프로그래밍
반복 제어 명령(4) 예제 프로그램 #1 (계속) 시스템프로그래밍 MAIN SEGMENT ASSUME CS:MAIN, DS:MAIN ; INCLUDE PUTAL.SUB START: MOV AX, MAIN MOV DS, AX MOV AX, 1 MOV CX, 10H NEXT: MOV DL, AL CALL PUTAL CALL SPACE INC AX LOOP NEXT MOV AH, 4CH INT 21H ;--------------------------------------------------------- SPACE: PROC NEAR PUSH AX PUSH DX MOV DL, ‘ ‘ MOV AH, 2 INT 21H POP DX POP AX RET SPACE ENDP ; MAIN ENDS END START 시스템프로그래밍
반복 제어 명령(5) LOOPE(LOOPZ) & LOOPNE 명령 어떤 조건이 만족하면 지정된 횟수 이내에서도 반복을 끝내는 반복 제어 명령 LOOPE(LOOPZ) 명령 앞의 비교 명령(또는 연산 명령)의 결과가 같고(ZF=1), CX 레지스터 값에서 1을 뺀 결과가 0이 아니면 반복 수행하는 명령 반복 상한 횟수를 CX 레지스터에 설정해 놓고 같지 않은 것이 나타날 때까지 반복하는 명령 예) 원소를 100개 가진 배열에서 0인 아닌 값을 가지는 첫번째 원소를 찾기 시스템프로그래밍
반복 제어 명령(6) LOOPE(LOOPZ) & LOOPNE 명령 LOOPNE 명령 앞의 비교 명령(또는 연산 명령)의 결과가 다르고(ZF=0), CX 레지스터 값에서 1을 뺀 결과가 0이 아니면 반복 수행하는 명령 반복 상한 횟수를 CX 레지스터에 설정해 놓고 같은 것이 나타날 때까지 반복하는 명령 예) 원소를 100개 가진 배열에서 값이 0인 첫번째 원소를 찾기 시스템프로그래밍
반복 제어 명령(7) 예제 프로그램 #2 문자열 “ HELLO-WORLD! “에서 앞의 공백의 개수와 공백이 아닌 연속된 문자의 개수를 세어 출력하도록 한다. 단 문자열의 길이는 20H를 넘지 않는다. 우선, PUTAL.SUB 모듈에 스트링 및 CR/LF 출력 프로시저를 추가, 확장한다. LOOPE / LOOPNE 명령을 사용한다. 시스템프로그래밍
반복 제어 명령(8) 예제 프로그램 #2 (계속) 시스템프로그래밍 POP DX POP AX RET ; PUTSTR: PUSH AX PUSH BX CMP DX, 0 JE PUTSTR_END MOV BX, DX CMP BYTE PTR [BX], ‘$’ MOV AH, 9 INT 21H PUTSTR_END: POP BX PUTCRLF: PUSH AX PUSH DX MOV AH, 2 MOV DL, 0DH MOV DL, 0AH ; MODULE – PUTAL.SUB ; PUTAL: PUSH AX PUSH CX PUSH AX AND AL, 0F0H MOV CL, 4 SHR AL, CL CALL PUTHEX POP AX AND AL, 0FH POP CX RET PUTHEX: PUSH AX PUSH DX MOV DL, AL CMP DL, 0AH JAE HEX2 ADD DL, ‘0’ JMP HEX3 HEX2: ADD DL, ‘A’-0AH HEX3: MOV AH, 2 INT 21H 시스템프로그래밍
반복 제어 명령(9) 예제 프로그램 #2 (계속) 시스템프로그래밍 MAIN SEGMENT ASSUME CS:MAIN, DS:MAIN ; INCLUDE PUTAL.SUB SPACE EQU ‘ ‘ MAX-LENGTH EQU 20H START: MOV AX, MAIN MOV DS, AX ; Count space length MOV CX, MAX_LENGTH MOV DL, 0 MOV SI, 0 MOV BX, OFFSET STR1 NEXT1: INC DL INC SI MOV AL, [BX+SI-1] CMP AL, SPACE LOOPE NEXT1 DEC DL MOV AL, DL MOV DX, OFFSET MSG1 CALL PUTSTR CALL PUTAL CALL PUTCRLF ; Count string length MOV DL, 0 NEXT2: INC DL INC SI MOV AL, [BX+SI-1] CMP AL, SPACE LOOPNE NEXT2 DEC DL MOV AL, DL MOV DX, OFFSET MSG2 CALL PUTSTR CALL PUTAL CALL PUTCRLF MOV AH, 4CH INT 21H ; STR1 DB ‘ HELLO-WORLD! ‘ MSG1 DB ‘ Space length = $’ MSG2 DB ‘ String length = $’ MAIN ENDS END START 시스템프로그래밍
반복 제어 명령(10) LOOP 명령 & 플래그 레지스터 LOOP 명령은 반복 수행 과정에서 카운터인 CX 레지스터에서 1을 빼는 연산을 수행한다 이러한 뺄셈 연산의 결과에 대해 플래그 레지스터 값을 영향을 받지 않는다. LOOP 명령은 현재 플래그 레지스터에 영향을 미치지 않는다 시스템프로그래밍
반복 제어 명령(11) String 명령 연속적인 데이터(문자열)에 대해 비교하거나 전송하기 위해 사용하는 명령 블록 데이터를 전송하는 전송 명령 : LODS / STOS / MOVS 블록 내의 데이터를 검색하는 검색 명령: SCAS / CMPS 리피트 프리픽스(Repeat Prefix)와 결합하여 사용 REP / REPE(REPZ) / REPNE(REPNZ) 시스템프로그래밍
반복 제어 명령(12) LODS 명령(메모리 레지스터) DS:[SI] 번지의 데이터를 AL(AX) 레지스터로 전송하는 명령 Direction Flag(DF)에 따라 SI 레지스터 값을 자동으로 증감 LODSB / LODSW 메모리 DS:[SI] AL(AX) LODB / LODW LODS 명령을 수행한 후에 자동으로 증가 시스템프로그래밍
반복 제어 명령(13) 예제프로그램 #3 LODS 명령을 이용하여 문자열을 한자씩 출력하는 프로그램 시스템프로그래밍 MAIN SEGMENT ASSUME CS:MAIN, DS:MAIN ; START: MOV AX, MAIN MOV DS, AX MOV SI, OFFSET MSG1 MOV CX, OFFSET MSG2 SUB CX, SI CLD NEXT: LODSB MOV DL, AL MOV AH, 2 INT 21H LOOP NEXT MOV AH, 4CH MSG1 DB ‘ MS-DOS MACRO ASSEMBLER’ MSG2 DB ? ; MAIN ENDS END START 시스템프로그래밍
반복 제어 명령(14) STOS 명령(레지스터 메모리) AL(AX) 레지스터의 내용은 ES:[DI] 번지의 메모리로 전송하는 명령 세그먼트 레지스터로 ES(EXTRA SEGMENT)를 사용 Direction Flag(DF)에 따라 DI 레지스터 값이 자동으로 증감 STOSB / STOSW 메모리 ES:[DI] AL(AX) STOB / STOW STOS 명령을 수행한 후에 자동으로 증가 시스템프로그래밍
반복 제어 명령(15) 예제프로그램 #4 STOS 명령을 이용하여 문자열을 복사하고 출력하는 프로그램 시스템프로그래밍 MAIN SEGMENT ASSUME CS:MAIN, DS:MAIN, ES:MAIN ; START: MOV AX, MAIN MOV DS, AX MOV ES, AX MOV SI, OFFSET MSG1 MOV DI, OFFSET MSG2 MOV CX, DI SUB CX, SI CLD NEXT: LODSB STOSB MOV DL, AL MOV AH, 2 INT 21H LOOP NEXT MOV AH, 4CH MSG1 DB ‘ MS-DOS MACRO ASSEMBLER’ MSG2 DB 20H DUP (?) ; MAIN ENDS END START 시스템프로그래밍
반복 제어 명령(16) MOVS 명령(메모리 메모리) DS:[SI] 번지의 메모리 내용을 ES:[DI] 번지의 메모리로 전송하는 명령 Direction Flag(DF)에 따라 SI & DI 레지스터 값이 자동으로 증감 MOVSB / MOVSW 메모리 ES:[DI] DS:[SI] MOVSB / MOVSW 시스템프로그래밍
반복 제어 명령(17) 예제프로그램 #5 예제프로그램 #4에서 문자열 복사 과정을 MOVS 명령으로 수정한 프로그램 MAIN SEGMENT ASSUME CS:MAIN, DS:MAIN, ES:MAIN ; START: MOV AX, MAIN MOV DS, AX MOV ES, AX MOV SI, OFFSET MSG1 MOV DI, OFFSET MSG2 MOV CX, DI SUB CX, SI CLD NEXT: MOVSB LOOP NEXT MOV AH, 4CH INT 21H MSG1 DB ‘ MS-DOS MACRO ASSEMBLER’ MSG2 DB 20H DUP (?) ; MAIN ENDS END START 시스템프로그래밍
반복 제어 명령(18) Repeat Prefix 명령 스트링 명령과 조합하여 사용 스트링 명령은 일정한 회수(CX 레지스터) 만큼 반복적으로 수행하도록 한다 REP / REPE(REPZ) / REPNE(REPNZ) REP : 스트링 명령을 CX 레지스터 값만큼 반복 수행 REPE(REPZ) : 비교 결과가 같고 CX 레지스터 값이 0이 아닌 동안 스트링 명령을 반복 수행 REPNE(REPNZ) : 비교 결과가 다르고 CX 레지스터 값이 0이 아닌 동안 스트링 명령을 반복 수행 예: REP LODSW REPE STOSB REPNZ MOVSB 시스템프로그래밍
반복 제어 명령(19) 예제프로그램 #6 예제프로그램 #5을 REPEAT PREFIX를 이용하여 수정한 프로그램 MAIN SEGMENT ASSUME CS:MAIN, DS:MAIN, ES:MAIN ; START: MOV AX, MAIN MOV DS, AX MOV ES, AX MOV SI, OFFSET MSG1 MOV DI, OFFSET MSG2 MOV CX, DI SUB CX, SI CLD REP MOVSB MOV AH, 4CH INT 21H MSG1 DB ‘ MS-DOS MACRO ASSEMBLER’ MSG2 DB 20H DUP (?) ; MAIN ENDS END START 시스템프로그래밍
반복 제어 명령(20) SCAS 명령 SCAS(SCAn String Byte/Word) 레지스터와 메모리 내용을 비교하는 명령 AL 레지스터 값과 ES:[DI] 주소의 메모리 내용을 비교하여 플래그 레지스터 상태 비트를 변경한다 Direction Flag(DF)에 따라 DI 레지스터 값이 자동으로 증감 AL 레지스터 및 메모리 내용은 변경되지 않는다 SCASB / SCASW 시스템프로그래밍
반복 제어 명령(21) 예제프로그램 #7 주어진 문자열에서 ‘&’문자를 찾아 위치를 출력하는 프로그램 시스템프로그래밍 MAIN SEGMENT ASSUME CS:MAIN, DS:MAIN, ES:MAIN ; INCLUDE PUTAL.SUB START: MOV AX, MAIN MOV DS, AX MOV ES, AX MOV AL, ‘&’ MOV DI, OFFSET STR1 MOV CX, STR2 – STR1 PUSH CX CLD NEXT: SCASB JE FOUND LOOP NEXT JMP NOTFOUND FOUND: DEC DI MOV DX, OFFSET MSG1 CALL PUTSTR MOV AH, DI MOV AL, AH CALL PUTAL MOV AX, DI CALL PUTAL MOV DX, OFFSET MSG2 CALL PUTSTR POP AX SUB AX, CX CALL PUTCRLF JMP EXIT ; NOTFOUND: MOV DX, OFFSET MSG3 EXIT: MOV AH, 4CH INT 21H MSG1 DB ‘Found address = $’ MSG2 DB ‘ H count = $’ MSG3 DB ‘Not found $’ STR1 DB ‘ABCDEFG&HIJK’ MAIN ENDS END START 시스템프로그래밍
반복 제어 명령(22) CMPS 명령 CMPS(CoMPare String Byte/Word) 메모리와 메모리의 내용을 비교하는 명령 DS:[SI] 주소의 메모리 내용과 ES:[DI] 주소의 메모리 내용을 비교하여 플래그 레지스터 상태 비트를 변경한다 Direction Flag(DF)에 따라 SI & DI 레지스터 값이 자동으로 증감 비교되는 메모리 내용은 변경되지 않는다 CMPSB / CMPSW 시스템프로그래밍
반복 제어 명령(23) 예제프로그램 #8 키보드로부터 입력된 문자열에서 “ABC”가 몇 번째 글자부터인지를 찾아 출력하는 프로그램 MAIN SEGMENT ASSUME CS:MAIN, DS:MAIN, ES:MAIN ; INCLUDE PUTAL.SUB START: MOV AX, MAIN MOV DS, AX MOV ES, AX CLD MOV DX, OFFSET MSG1 CALL PUTSTR CALL PUTCRLF MOV DX, OFFSET MAX_CHARS MOV AH, 0AH INT 21H XOR CX, CX MOV CL, CHARS_ENTERED MOV BP, OFFSET BUFF DEC BP INC CX NEXT: DEC CX CMP CX, 3 JB NOTFOUND INC BP MOV DI, BP MOV SI, OFFSET CMP_STR CMPSB JNE NEXT MOV DX, MSG2 CALL PUTSTR MOV AL, CHARS_ENTERED SUB AL, CL CALL PUTAL CALL PUTCRLF JMP EXIT 시스템프로그래밍
반복 제어 명령(24) 예제프로그램 #8(계속) 시스템프로그래밍 ; NOTFOUND: MOV DX, OFFSET MSG3 CALL PUTSTR CALL PUTCRLF EXIT: MOV AH, 4CH INT 21H MSG1 DB ‘Input string including <ABC> : $’ MSG2 DB ‘Found characters <ABC> at $’ MSG3 DB ‘Not found $’ MAX_CHARS DB 80H CHARS_ENTERED DB ? BUFF DB 80H DUP (?) CMP_STR DB ‘ABC’ MAIN ENDS END START 시스템프로그래밍
입출력 명령(1) CPU & 입출력 입출력(I/O : Input/Output) 입출력 제어기(I/O Controller) 메모리 내용을 출력 장치에 전송하거나 입력 장치에서 입력된 내용을 메모리에 전송하는 작업 모든 입출력은 CPU에 의해 이루어진다 입출력 제어기(I/O Controller) CPU와 입출력 장치간에 데이터 전송을 제어하는 장치 I/O Channel 이라고도 함 입출력 장치는 직접 메모리로부터 데이터를 전송하는 것이 아니라 CPU와 입출력 제어기 사이의 입출력 연산과정을 통해 입출력이 이루어진다 IDE Controller - HDD/FDD 입출력 제어 Sound Card – MIC/Speaker를 통한 sound 입출력 제어 시스템프로그래밍
입출력 명령(2) CPU & 입출력(계속) 입출력 포트(I/O Port) 입출력 명령(I/O 명령) 각각의 입출력 제어기는 자신의 입출력 포트가 할당된다 메모리 공간은 주소를 통해 구분되듯이 입출력 제어기는 입출력 포트를 이용하여 구분한다 입출력 포트는 입출력 주소공간이라고 할 수 있다 입출력 명령(I/O 명령) 입출력 포트를 통해 입출력을 수행하는 명령 IN 명령 입력 포트로부터 데이터를 입력하는 명령 IN [AL/AX], [port-number/DX] OUT 명령 출력 포트로 데이터를 출력하는 명령 OUT [port-number/DX], [AL/AX] 시스템프로그래밍
입출력 명령(3) 예제프로그램 #9 10회 부저를 울리는 프로그램 시스템프로그래밍 MAIN SEGMENT ASSUME CS:MAIN ; DELAY EQU 6000H START: MOV BX, 10 NEXT: IN AL, 61H PUSH AX OR AL, 2 OUT 61H, AL MOV CX, DELAY WAIT1: LOOP WAIT1 POP AX WAIT2: LOOP WAIT2 DEC BX JNZ NEXT MOV AH, 4CH INT 21H MAIN ENDS END START 시스템프로그래밍
8086 어셈블리 명령어 요약 8086 명령어 데이터 전송 명령 – MOV 산술연산 명령 – ADD, ADC, SUB, SBB, MUL, DIV, INC, DEC 논리연산 명령 – AND, OR, XOR, NOT, NEG 비트연산명령 – SHL, SHR, SAR, ROL, ROR, RCL, RCR 비교 분기 명령 – CMP, TEST, JMP, JE, JNE, JAE, CALL, RET 반복 명령 - LOOP, LOOPE, LOOPNE 스트링 명령 – LODSB, STOSB, MOVSB, SCASB, CMPSB I/O 명령 – IN, OUT 인터럽트 명령 – INT, IRET CPU 제어 명령 – WAIT, ESC, LOCK, HLT, NOP 그외 명령 – PUSH, POP, XCHG, XLAT 시스템프로그래밍