어셈블리어 (2) - 8086 매크로 어셈블리어 시스템 프로그래밍 - Lecture #4 신라대학교 컴퓨터공학과 시스템프로그래밍
사칙 연산 명령 사칙 연산 명령 ADD(ADDition), ADC(Addition with Carry) SUB(SUBtract), SBB(SuBtract with Borrow) MUL(MULtiply), IMUL(Integer MULtiply) DIV(DIVide) XCHG(eXCHanGe) INC(INCrement), DEC(DECrement) 신라대학교 컴퓨터공학과 시스템프로그래밍
ADD 명령 (1) 형식 ADD [Register/Memory] [Register/Memory/Immediate Vale] 사용 예 : ADD AX, 1234H ADD AX, [BX] ADD AX, CX ADD [BX], AX ADD WORD PTR [BX], 1234H 주의사항: 두개의 피연산자 모두 메모리가 올 수 없다 메모리에 수치를 더할 때에서 BYTE or WORD 지정이 필요 ADD [BX], 12H ADD BYTE PTR [BX], 12H 신라대학교 컴퓨터공학과 시스템프로그래밍
ADD 명령 (2) 예제 #1 4040H+0102H를 수행하고 덧셈 결과를 출력한다 ASSUME CS:MAIN ; MAIN SEGMENT ASSUME CS:MAIN ; MOV BX, 4040H ADD BX, 0102H MOV DL, BH MOV AH, 2 INT 21H MOV DL, BL MOV AH, 4CH MAIN ENDS END 예제 #1 4040H+0102H를 수행하고 덧셈 결과를 출력한다 신라대학교 컴퓨터공학과 시스템프로그래밍
ADD 명령 (3) 예제 #2 키보드에서 입력된 문자를 에코백하고, ASCII 코드 상의 그 다음의 두 개의 문자를 출력한 다음 입력된 문자를 소문자로 변환하여 출력한다 MAIN SEGMENT ASSUME CS:MAIN, DS:MAIN ; ONE EQU 1 TOLOWER EQU ‘a’ – ‘A’ MOV AX, CS ADD DS, AX MOV AH, 1 INT 21H MOV KEEP, AL ADD AL, ONE MOV, DL, AL MOV AH, 2 ADD AL, ONE MOV, DL, AL MOV AH, 2 INT 21H ; MOV, DL, KEEP ADD DL, TOLOWER MOV AH, 4CH KEEP DB ? MAIN ENDS END 신라대학교 컴퓨터공학과 시스템프로그래밍
ADC 명령 (1) 정의 Carry flag 덧셈 연산에서 carry bit를 같이 더하는 연산을 수행 이전 덧셈 연산에서 발생한 자리올림(0/1)을 저장 Flag register의 CF bit 덧셈 연산에서 carry bit를 같이 더하는 연산을 수행 16 bit 이상의 데이터 덧셈 연산에서 하위 16 bit 덧셈을 먼저 수행하고 이 때에 발생한 캐리를 상위 16 bit 덧셈 연산에 동시에 더하고자 할 때에 사용 가능 CF AX + CX AX’ BX + DX BX’ 신라대학교 컴퓨터공학과 시스템프로그래밍
ADC 명령 (2) 예제 10008000H + 20008123H를 계산하여 메모리에 저장한다 MAIN SEGMENT ASSUME CS:MAIN, DS:MAIN ; MOV AX, CS ADD DS, AX MOV AX, 1000H MOV BX, 8000H MOV CX, 2000H MOV DX, 8123H ADD BX, DX ADC AX, CX MOV ANS1, AX MOV ANS2, BX MOV AH, 4CH INT 21H ; ANS1 DW 0 ANS2 DW 0 MAIN ENDS END 신라대학교 컴퓨터공학과 시스템프로그래밍
SUB 명령 (1) 형식 SUB [Register/Memory] [Register/Memory/Immediate Vale] 사용 예 : SUB AX, 1234H SUB AX, [BX] SUB AX, CX SUB [BX], AX SUB WORD PTR [BX], 1234H 주의사항: 두개의 피연산자 모두 메모리가 올 수 없다 메모리에 수치를 더할 때에서 BYTE or WORD 지정이 필요 SUB [BX], 12H SUB BYTE PTR [BX], 12H 신라대학교 컴퓨터공학과 시스템프로그래밍
SUB 명령 (2) 예제 변수 AAA에 저장되어 있는 값에서 변수 BBB에 저장되어 있는 값을 빼고 결과를 AAA에 저장하여라 MAIN SEGMENT ASSUME CS:MAIN, DS:MAIN ; MOV AX, CS MOV DS, AX MOV BX, BBB SUB AAA, BX MOV AH, 4CH INT 21H AAA DB 200 BBB DB 100 MAIN ENDS END 예제 변수 AAA에 저장되어 있는 값에서 변수 BBB에 저장되어 있는 값을 빼고 결과를 AAA에 저장하여라 신라대학교 컴퓨터공학과 시스템프로그래밍
SBB 명령 (1) 형식 16 bit 뺄셈 연산에서 자리빌림(borrow)이 발생하면 carry flag가 세트된다 뺄셈 연산에서 carry bit를 같이 빼는 연산을 수행 ADC 명령어 유사하게 동작 16 bit 이상의 데이터 뺄셈 연산에서 하위 16 bit 뺄셈을 먼저 수행하고 이 때에 발생한 캐리를 상위 16 bit 뺄셈 연산에서 같이 빼고자 할 때에 사용 가능 신라대학교 컴퓨터공학과 시스템프로그래밍
SBB 명령 (2) 예제 #1 12340000H – 12000H 연산을 수행하는 프로그램을 작성하여라 MAIN SEGMENT ASSUME CS:MAIN, DS:MAIN ; MOV AX, CS MOV DS, AX MOV WORK1, 1234H MOV WORK2, 0000H SUB WORK2, 2000H SBB WORK1, 0001H MOV AH, 4CH INT 21H WORK1 DW 0 WORK2 DW 0 MAIN ENDS END 예제 #1 12340000H – 12000H 연산을 수행하는 프로그램을 작성하여라 신라대학교 컴퓨터공학과 시스템프로그래밍
SBB 명령 (3) 예제 #2 다음 예제에서 변수 ANS1~ANS4에 저장되는 값은 무엇인가? MAIN SEGMENT ASSUME CS:MAIN, DS:MAIN ; MOV AX, CS MOV DS, AX MOV AH, 11H MOV BH, 22H MOV CL, 33H MOV SI, 4444H MOV BP, 5555H ADD AH, 66H MOV BYTE PTR ANS1, AH ADD CL, 0FFH ADC BH, 01H MOV BYTE PTR ANS2, BH MOV BYTE PTR ANS2+1, CH SUB BP, SI MOV WORD PTR ANS3, BP ; MOV AH, 4CH INT 21H ANS1 DW 0 ANS2 DW 0 ANS3 DB 0 ANS4 DW 9999H MAIN ENDS END 신라대학교 컴퓨터공학과 시스템프로그래밍
음수의 표현 (1) 음수의 표현 8086 프로세서는 부호를 가진 2의 보수(signed 2’s complement)를 이용하여 음수를 표현 8 bit/16 bit 데이터에서 최상위 비트(MSB: Most Significant Bit)를 부호 비트로 사용 0 : 양수 / 1 : 음수 나머지 비트를 이용하여 수를 표현 음수 예 : - 01H 0FFH - 80H 80H - 0FFH 01H : 8 bit로 표현하는 경우 에러 신라대학교 컴퓨터공학과 시스템프로그래밍
음수의 표현 (2) 음수의 범위(8 bit의 경우) 2진수 MSB LSB 보수를 사용하지 경우의 16진수 보수를 사용하는 경우의 16 진수 보수의 경우 부호 00000000 00000001 ~ 01111110 01111111 1 7E 7F 양 수 10000000 10000001 11111110 11111111 80 81 FE FF -80 -7F -2 -1 음 수 신라대학교 컴퓨터공학과 시스템프로그래밍
음수의 표현 (3) 예제 다음 예제에서 AL & AX 레지스터에 저장되는 값은 무엇인가? cf) 어셈블러는 음수에 단순히 보수로 변환할 뿐 음수의 범위를 검사하지 않는다 MAIN SEGMENT ASSUME CS:MAIN ; P1 EQU 1H PFF EQU 0FFH M1 EQU -1H MFF EQU -0FFH MOV AL, P1 MOV AL, PFF MOV AL, M1 MOV AL, MFF MOV AX, P1 MOV AX, PFF MOV AX, M1 MOV AX, MFF MAIN ENDS END 신라대학교 컴퓨터공학과 시스템프로그래밍
수의 확장 (1) 수의 확장 어셈블리 프로그램에서는 연산 시에 변수의 범위를 검사하지 않는다 오버플로우(overflow)가 발생하지 않는다 프로그래머가 연산 결과를 고려하여 변수를 적절하게 확장하여 연산을 수행하도록 하여야 한다 8 bit 레지스터의 값을 16 bit로 확장 양의 정수(unsigned integer) 확장 확장 비트를 0으로 설정 부호를 갖는 정수(signed integer)의 확장 확장 비트를 부호 비트로 설정 신라대학교 컴퓨터공학과 시스템프로그래밍
수의 확장 (2) 예제 #1 4개의 숫자 50H, 60H, 80H, 0F0H를 합하여 변수 ANS에 저장한다 MAIN SEGMENT ASSUME CS:MAIN, DS:MAIN ; MOV AX, CS MOV DS, AX MOV AX, 0 MOV DL, VAR1 ADD AX, DX MOV DL, VAR2 MOV DL, VAR3 MOV DL, VAR4 MOV ANS, AX ; MOV AH, 4CH INT 21H VAR1 DB 50H VAR2 DB 60H VAR3 DB 80H VAR4 DB 0F0H ANS DW ? MAIN ENDS END MOV DX, 0 or MOV DH, 0 신라대학교 컴퓨터공학과 시스템프로그래밍
수의 확장 (3) 부호를 갖는 정수의 확장 8 bit 정수를 16 bit 정수로 확장할 때에는 상위 바이트를 부호 비트를 이용하여 확장 양수이면 상위 바이트를 00으로 설정 음수이면 상위 바이트를 FF로 설정 부호확장명령 8/16 bit 정수를 16/32 bit 정수로 변환시키는 명령 CBW(Convert Byte to Word) – AL레지스터의 숫자를 부호 확장하여 AX 레지스터에 저장 CWD(Convert Word to Double word) – AX 레지스터의 숫자를 부호확장하여 상위 16 bit를 DX 레지스터에, 하위 16 bit를 AX 레지스터에 저장 신라대학교 컴퓨터공학과 시스템프로그래밍
수의 확장 (4) 예제 #1 부호를 갖는 4 개의 숫자를 합하여 변수 ANS에 저장한다 MAIN SEGMENT ASSUME CS:MAIN, DS:MAIN ; MOV AX, CS MOV DS, AX MOV AX, 0 MOV DX, AX ADD BX, OFFSET VAR MOV AL, [BX] CBW ADD DX, AX MOV AL, [BX] + 1 MOV AL, [BX+2] ADD DX, AX MOV AL, 3[BX] CBW MOV ANS, DX ; MOV AH, 4CH INT 21H VAR DB 50H, 60H, 80H, 0F0H ANS DW ? MAIN ENDS END 신라대학교 컴퓨터공학과 시스템프로그래밍
XCHG 명령 형식 두 개의 데이터를 상호 교환하는 명령 XCHG [Register/Memory] [Register/Memory] 사용 예 : XCHG AX, BX XCHG AX, [BX] XCHG[BX], AX 신라대학교 컴퓨터공학과 시스템프로그래밍
MUL 명령 (1) 형식 MUL [Register / Memory] - 양의 정수 곱셈 IMUL [Register / Memory] - 부호를 갖는 정수 곱셈 MUL 명령은 피연산자를 하나를 갖는다 주어진 피연산자와 AL / AX 레지스터와 곱셈을 수행하여 결과를 AX 또는 DX, AX 레지스터에 저장한다 8 bit 곱셈 16 bit 곱셈 8 bit Register or memory AL X AX 16 bit Register or memory AX X DX AX 신라대학교 컴퓨터공학과 시스템프로그래밍
MUL 명령 (2) 사용 예 10 * 20 피연산자가 메모리(간접주소)인 경우에는 데이터 형 지정이 필요 MOV AL, 10 MOV BL, 20 MUL BL 피연산자가 메모리(간접주소)인 경우에는 데이터 형 지정이 필요 MOV BX, OFFSET DATA1 MUL [BX] ……. DATA1 DW 1234H 상수와의 직접 곱셈은 지원하지 않는다 MUL 20 MUL WORD PTR [BX] 신라대학교 컴퓨터공학과 시스템프로그래밍
MUL 명령 (3) 예제 #1 부호없는 정수 및 부호있는 정수의 곱셈 MOV DI, OFFSET ANS4 CODE SEGMENT ASSUME CS:CODE, DS:CODE ; MOV AX, CS MOV DS, AX MOV AL, DATA_1A MUL DATA_1B MOV ANS1, AX MOV AX, DATA_2A MUL DATA_2B MOV ANS2_A, DX MOV ANS2_B, AX MOV AL, DATA_3A MOV BL, DATA_3B IMUL BL MOV ANS3, AX MOV AX, DATA_4A MOV BX, OFFSET DATA_4B IMUL WORD PTR [BX] MOV DI, OFFSET ANS4 MOV [DI], DX MOV [DI+2], AX MOV AH, 4CH INT 21H ; DATA_1A DB 0F0H DATA_1B DB 11H DATA_2A DW 1234H DATA_2B DW 2001H DATA_3A DB -10H DATA_3B EQU 11H DATA_4A DW -1000H DATA_4B DW 1234H ANS1 DW ? ANS2_A DW ? ANS2_B DW ? ANS3 DW ? ANS4 DW ? CODE ENDS END 신라대학교 컴퓨터공학과 시스템프로그래밍
DIV 명령 (1) 형식 DIV [Register / Memory] - 양의 정수 나눗셈 IDIV [Register / Memory] - 부호를 갖는 정수 나눗셈 DIV 명령은 피연산자를 하나를 갖는다 AX / DX,AX 레지스터 내용을 피연산자로 나누고, 나머지와 몫을 각각 AH, AL / DX, AX 레지스터에 저장한다 16 bit / 8 bit 나눗셈 32 bit / 16 bit 나눗셈 나머지 몫 8 bit Register or memory AX X AH AL 16 bit Register or memory DX AX X DX AX 신라대학교 컴퓨터공학과 시스템프로그래밍
DIV 명령 (2) 주의 사항 부호를 갖는 정수의 나눗셈에서 몫과 나머지의 부호 0으로 나누는 나눗셈 몫의 부호는 일반적인 수학 공식에 의해 결정 피젯수와 젯수의 부호가 같으면 양수, 다르면 음수 나머지 부호는 피젯수의 부호를 따른다 0으로 나누는 나눗셈 INT 0 인터럽트를 발생하여 에러를 처리 나눗셈에 의한 오버플로우(overflow) 0FFFFH / 01H 0FFFFH : overflow 신라대학교 컴퓨터공학과 시스템프로그래밍
DIV 명령 (3) 예제 #1 삼각형의 중심을 구하는 프로그램 MOV AL, A.Y CODE SEGMENT ASSUME CS:CODE, DS:DATA ; MOV AX, DATA MOV DS, AX MOV AL, A.X CBW MOV BX, AX MOV AL, B.X ADD BX, AX MOV AL, C.X ADD AX, BX MOV BH, 3 IDIV BH MOV M.X, AL MOV AL, A.Y CBW MOV BX, AX MOV AL, B.Y ADD BX, AX MOV AL, C.Y ADD AX, BX MOV BH, 3 IDIV BH MOV M.Y, AL ; MOV AH, 4CH INT 21H CODE ENDS 신라대학교 컴퓨터공학과 시스템프로그래밍
DIV 명령 (4) 예제 #1(계속) DATA SEGMENT POINT STRUC X DB ? Y DB ? POINT ENDS ; A POINT <12, 41> B POINT <-53, -19> C POINT <25, -11> M POINT <?, ?> DATA ENDS END 신라대학교 컴퓨터공학과 시스템프로그래밍
DIV 명령 (5) 예제 #2 초를 시간, 분, 초로 바꾸는 프로그램 CODE SEGMENT DATA SEGMENT ASSUME CS:CODE, DS:DATA ; MOV AX, DATA MOV DS, AX MOV SI, OFFSET SECOND MOV AX, [SI] MOV DX, [SI+2] MOV BX, SIXTY DIV BX MOV TIME2.SEC, DL MOV BL, SIXTY DIV BL MOV TIME2.MIN, AH MOV TIME2.HOUR, AL MOV AH, 4CH INT 21H CODE ENDS DATA SEGMENT TIME STRUC HOUR DB ? MIN DB ? SEC DB ? TIME ENDS ; SECOND DD 72912 TIME2 TIME <?,?,?> DATA ENDS END 신라대학교 컴퓨터공학과 시스템프로그래밍
INC/DEC 명령 형식 사용 예 INC [Register / Memory] - 피연산자의 값을 1 증가 DEC [Register / Memory] - 피연산자의 값을 1 감소 인덱스 변수 등을 1 증가 또는 감소시킬 때에 사용 사용 예 INC CX, INC [BX] DEC BI 신라대학교 컴퓨터공학과 시스템프로그래밍