300 likes | 849 Views
어셈블리어 (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). 형식
E N D
어셈블리어 (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) MAIN SEGMENT ASSUME CS:MAIN ; MOV BX, 4040H ADD BX, 0102H MOV DL, BH MOV AH, 2 INT 21H MOV DL, BL MOV AH, 2 INT 21H ; MOV AH, 4CH INT 21H 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 INT 21H ADD AL, ONE MOV, DL, AL MOV AH, 2 INT 21H ; MOV, DL, KEEP ADD DL, TOLOWER MOV AH, 2 INT 21H ; MOV AH, 4CH INT 21H KEEP DB ? MAIN ENDS END 신라대학교 컴퓨터공학과 시스템프로그래밍
BX + DX BX’ CF AX + CX AX’ ADC 명령 (1) • 정의 • Carry flag • 이전 덧셈 연산에서 발생한 자리올림(0/1)을 저장 • Flag register의 CF bit • 덧셈 연산에서 carry bit를 같이 더하는 연산을 수행 • 16 bit 이상의 데이터 덧셈 연산에서 하위 16 bit 덧셈을 먼저 수행하고 이 때에 발생한 캐리를 상위 16 bit 덧셈 연산에 동시에 더하고자 할 때에 사용 가능 신라대학교 컴퓨터공학과 시스템프로그래밍
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) 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) 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의 경우) 신라대학교 컴퓨터공학과 시스템프로그래밍
음수의 표현 (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)의 확장 • 확장 비트를 부호 비트로 설정 신라대학교 컴퓨터공학과 시스템프로그래밍
MOV DX, 0 or MOV DH, 0 수의 확장 (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 ADD AX, DX MOV DL, VAR3 ADD AX, DX MOV DL, VAR4 ADD AX, DX 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 신라대학교 컴퓨터공학과 시스템프로그래밍
수의 확장 (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 CBW ADD DX, AX MOV AL, [BX+2] CBW ADD DX, AX MOV AL, 3[BX] CBW ADD DX, AX 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 AX X AL 16 bit Register or memory DX X AX AX 신라대학교 컴퓨터공학과 시스템프로그래밍
MUL WORD PTR [BX] MUL 명령 (2) • 사용 예 • 10 * 20 MOV AL, 10 MOV BL, 20 MUL BL • 피연산자가 메모리(간접주소)인 경우에는 데이터 형 지정이 필요 MOV BX, OFFSET DATA1 MUL [BX] ……. DATA1 DW 1234H • 상수와의 직접 곱셈은 지원하지 않는다 MOV AL, 10 MUL 20 신라대학교 컴퓨터공학과 시스템프로그래밍
MUL 명령 (3) • 예제 #1 • 부호없는 정수 및 부호있는 정수의 곱셈 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 X AL AX AH 16 bit Register or memory AX DX X DX AX 신라대학교 컴퓨터공학과 시스템프로그래밍
DIV 명령 (2) • 주의 사항 • 부호를 갖는 정수의 나눗셈에서 몫과 나머지의 부호 • 몫의 부호는 일반적인 수학 공식에 의해 결정 • 피젯수와 젯수의 부호가 같으면 양수, 다르면 음수 • 나머지 부호는 피젯수의 부호를 따른다 • 0으로 나누는 나눗셈 • INT 0 인터럽트를 발생하여 에러를 처리 • 나눗셈에 의한 오버플로우(overflow) • 0FFFFH / 01H 0FFFFH : overflow • INT 0 인터럽트를 발생하여 에러를 처리 신라대학교 컴퓨터공학과 시스템프로그래밍
DIV 명령 (3) • 예제 #1 • 삼각형의 중심을 구하는 프로그램 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 CBW ADD BX, AX MOV AL, C.X CBW ADD AX, BX MOV BH, 3 IDIV BH MOV M.X, AL ; MOV AL, A.Y CBW MOV BX, AX MOV AL, B.Y CBW ADD BX, AX MOV AL, C.Y CBW 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 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 신라대학교 컴퓨터공학과 시스템프로그래밍