All pastes #762230 Raw Edit

Unnamed

public text v1 · immutable
·published 2007-11-05 14:49 UTC
rendered paste body
; ★★★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