기존의 코드를 재활용하기 위해 코드 작성전 프로시저를 디자인을 한다.
프로시저의 input과 output 그리고 call하는 프로시저 정도를 입력하고, 나중에 다시 봐도 알아보기 쉽도록 친절하게 작성한다.
11주차 프로시저 디자인 실습은 이전에 만들어논 배열의 합을 구하는 프로시저에서 GetIntegerCount 프로시저를 추가하여 입력받고자 하는 배열의 크기를 정한다.
Title 11주차 프로시저 디자인
INCLUDE Irvine32.inc
IntegerCount = 20; array size
.data
prompt1 BYTE "Enter a signed integer: ",0
prompt2 BYTE "The sum of the integers is: ",0
prompt3 BYTE " How many integers wil be added? : ",0
array DWORD IntegerCount DUP(?)
.code
;-----------------------------------------------------
main PROC
; Main program control procedure.(메인)
; Calls: Clrscr, PromptForIntegers,
; ArraySum, DisplaySum, GetIntegerCount
;-----------------------------------------------------
call Clrscr
mov esi,OFFSET array
call GetIntegerCount
mov ecx, eax ;; GetIntegerCount 에서 받은 eax를 루프카운터로 사용
call PromptForIntegers
call ArraySum
call DisplaySum
exit
main ENDP
;-----------------------------------------------------
GetIntegerCount PROC
; 기능 >> 입력 받을 정수의 갯수를 입력 받는 프로시저
; 매개변수 >> 없음
; 반환값 >> EAX : 실제 원소의 갯수
; Calls >> WriteString, ReadInt, Crlf
;-----------------------------------------------------
mov edx,OFFSET prompt3 ; display message
call WriteString
call ReadDec ; read Dec EAX
call Crlf
ret
GetIntegerCount ENDP
;-----------------------------------------------------
PromptForIntegers PROC
;
; 사용자로부터 배열에 정수를 입력 받는다.
; 매개변수 >> ESI : 더블형 정수 배열 주소, ECX : 배열의 크기
; 반환값 >> 사용자에 의해 입력된 정수)
; Calls: ReadInt, WriteString(정수입력, 정수입력을 위한 안내문)
;-----------------------------------------------------
pushad ; save all registers
mov edx,OFFSET prompt1
L1:
call WriteString ; display string
call ReadInt ; read integer into EAX
call Crlf ; go to next output line
mov [esi],eax ; store in array
add esi,4 ; next integer
loop L1
L2:
popad ; restore all registers
ret
PromptForIntegers ENDP
;-----------------------------------------------------
ArraySum PROC USES esi ecx
;
; 기능 >> 32비트 정수 배열의 합을 구한다
; 매개변수 >> ESI : 배열의 시작주소, ECX : 배열의 크기
; 반환값 >> EAX : 배열의 합
;-----------------------------------------------------
mov eax,0 ; set the sum to zero
L1:
add eax,[esi] ; add each integer to sum
add esi,4 ; point to next integer
loop L1 ; repeat for array size
L2:
ret
ArraySum ENDP
;------------------------------------------------
DisplaySum PROC
;
; 기능 >> 합을 출력한다.
; 매개변수 >> EAX : 합이 저장된 메모리
; 반환값 >> 없음
;------------------------------------------------
push edx
mov edx,OFFSET prompt2 ; display message
call WriteString
call WriteInt ; display EAX
call Crlf
pop edx
ret
DisplaySum ENDP
END main