페이지

2014. 11. 11.

[MASM] 프로시저 디자인

기존의 코드를 재활용하기 위해 코드 작성전 프로시저를 디자인을 한다.
프로시저의 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