; ★★★3개의 정수를 입력받아, 각 정수의 세제곱의 합을 구하여 출력하는 프로그램 구현★★★
.MODEL SMALL ; 모델은 SMALL로 쓰겠다. 코드,데이트 각각이 64KB 넘지 않게 어셈블러에게 지시해준다.
.586
DATA SEGMENT
TBUFF DT ? ; 10진수로 입력 혹은 출력하기 위한 변수.
DA DD ?
DATA1 DD ?
DATA2 DD ?
DATA3 DD ?
RESULT DD ? ; (세 변수의 각각 세제곱들의 합을 저장할 변수.)
; 변수(메모리영역)들을 선언한다.
DATA_1 DB 0DH, 0AH, 'DATA1:$'
DATA_2 DB 0DH, 0AH, 'DATA2:$'
DATA_3 DB 0DH, 0AH, 'DATA3:$'
RESULT_1 DD 0DH, 0AH, 'RESULT:$'
; 출력메시지를 저장하는 변수들을 선언한다. 나중에 OFFSET으로 이 변수를 가리키도록 하여 메시지를 출력한다.
INTRO DB 0DH, 0AH, 'ENTER DATA1 : $'
INTRO2 DB 0DH, 0AH, 'ENTER DATA2 : $'
INTRO4 DB 0DH, 0AH, 'ENTER DATA3 : $'
; 입력메시지를 저장하는 변수들을 선언한다. 나중에 OFFSET으로 이 변수를 가리키도록 하여 메시지를 입력받는다.
DATA ENDS
CODE SEGMENT ; 코드세그먼트를 사용하겠다..는 시작을 알린다.
INCLUDE SGIO.INC ; 10진수로 입력 혹은 출력하기 위해 포함하는 파일.
ASSUME CS:CODE, DS:DATA
START:
MOV AX, DATA ; 데이터 세그먼트 초기화.
MOV DS, AX
LEA DX, INTRO
MOV AH, 9H ; 'ENTER DATA1 :"라는 문자열을 화면으로 출력하는 SYSTEM 호출.
INT 21H
CALL DEC32IN ; DATA1의 입력데이터를 읽어들이는 함수.
MOV DATA1, EDX ; 읽어들인 DATA1의 값을 DATA1에 기억.
MOV DX, OFFSET INTRO2 ; INTRO2의 주소값을 전송한다.
MOV AH, 9H ; 'ENTER DATA2 :"라는 문자열을 화면으로 출력하는 SYSTEM 호출.
INT 21H
CALL DEC32IN ; DATA2의 입력데이터를 읽어들이는 함수.
MOV DATA2, EDX ; 읽어들인 DATA2의 값을 DATA2에 기억.
MOV DX, OFFSET INTRO4 ; INTRO4의 주소값을 전송한다.
MOV AH, 9H ; 'ENTER DATA3 :"라는 문자열을 화면으로 출력하는 SYSTEM 호출.
INT 21H
CALL DEC32IN ; DATA3의 입력데이터를 읽어들이는 함수.
MOV DATA3, EDX ; 읽어들인 DATA3의 값을 DATA3에 기억.
MOV DX, OFFSET DATA_1 ; DATA_1의 주소값을 전송.
MOV AH, 9H ; "DATA1 :"이라는 문자열을 화면으로 출력하는 system호출.
INT 21H
MOV EDX, DATA1 ; DATA1값을 화면에 출력하기 위해 EDX로 전송.
CALL DEC32OUT ; DATA1값을 화면에 출력하기 위한 함수.
MOV DX, OFFSET DATA_2 ; 주소값 전송.
MOV AH, 9H
INT 21H
MOV EDX, DATA2 ; DATA2 값을 화면에 출력하기 위해 EDX로 전송한다.
CALL DEC32OUT ; 화면에 출력하기 위한 함수.
MOV DX, OFFSET DATA_3 ; 주소값 전송.
MOV AH, 9H
INT 21H
MOV EDX, DATA3 ; DATA3 값을 화면에 출력하기 위해 EDX로 전송한다.
CALL DEC32OUT ; 화면에 출력위한 함수.
NEW_NUM:
MOV EAX, DATA1
MOV ECX, EAX
MUL ECX
MUL ECX
MOV EBX, EAX
; DATA1의 값을 같은크기의 레지스터 EAX에 넣어두고, 또 ECX에도 저장한다. MUL 명령어를 사용하여 ECX와 EAX에 있는 값을
;곱하여 EAX에 저장한다. 이렇게 되면 EAX와 ECX에는 같은 값이 들어있었으므로, 결국 EAX에는 어떤 수의 제곱이 저장된다.
;그리고 다시 MUL명령어를 사용하여, 결국 어떤 수의 세제곱을 EAX 에 저장한다. 그리고 MOV EBX, EAX 를 통해 EAX에 저장된
;세제곱 값을 EBX 에 전송하여 저장한다.
MOV EAX, DATA2
MOV ECX, EAX
MUL ECX
MUL ECX
ADD EBX, EAX
; DATA2 값의 세제곱 구하여 기존의 EBX에 저장된 값과 더하여 다시 EBX 에 저장.
MOV EAX, DATA3
MOV ECX, EAX
MUL ECX
MUL ECX
ADD EBX, EAX
; DATA3 값의 세제곱 구하여 기존의 EBX에 저장된 값과 더하여 다시 EBX 에 저장.
MOV RESULT, EBX ; 결과를 RESULT에 저장.
MOV DX, OFFSET RESULT_1 ; RESULT_1의 주소값을 전송하여 'RESULT:'라는 문자열을 출력하도록 한다.
MOV AH, 9H
INT 21H
MOV EDX, RESULT
CALL DEC32OUT ; 화면에 결과값을 출력한다.
.EXIT
CODE ENDS ; 코드 세그먼트 종료.
END START