; ★★★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