Thursday, March 17, 2011

Proc Demo by Ronald J. Hart

; Title: CISS 360 Proc Demo 1
;------------------------------------------------------------
; Description: This program demonstrates how a proc is called
; and how a proc accesses parameters passed to it.
;------------------------------------------------------------
; Programmer: Ron Hart
;------------------------------------------------------------
; Date/Time: Thursday, January 27, 2011 4:05 PM
;------------------------------------------------------------
.586
.MODEL FLAT
INCLUDE console_io.h ; header file for console input/output
.STACK 4096 ; reserve 4096-byte (1024 DWORD) stack
;------------------------------------------------------------
; Input/Output Facility
;------------------------------------------------------------
; Macro Operand
;
; put_ch DWORD/Reg (Displays character in parameter)
; get_ch None (Loads character from keyboard into EAX)
; put_str BYTE (Displays string beginning at given address)
; put_i DWORD/Reg (Displays integer value in parameter)
; put_fp REAL4/Reg (Displays float value in parameter)
; get_i DWORD (Loads integer entered at keyboard into parameter)
; get_fp REAL4 (Loads float entered at keyboard into parameter)
; get_str BYTE (Loads string entered at keyboard into parameter)
;------------------------------------------------------------

.DATA ;****************************************************
;* Data Section *
;****************************************************

x DWORD ?
y DWORD ?
Sum DWORD ?

prompt_1 BYTE "Enter first integer: ",0
prompt_2 BYTE "Enter second integer: ",0
result BYTE "Sum is ",0

newline DWORD 10

.CODE ;****************************************************
;* Code Section *
;****************************************************

_MainProc PROC

put_str prompt_1 ; prompt for 1st integer value
get_i x ; get 1st integer value
put_str prompt_2 ; prompt for 2nd integer value
get_i y ; get 2nd integer value

push y ; push 2nd parameter
push x ; push 1st parameter

call Adder ; invocation: Adder (x, y)

add esp, 8 ; clean up stack
mov Sum, eax ; save sum (i.e., value "returned" by proc)
put_str result ; display result label
put_i Sum ; display sum
put_ch newline ; display newline
put_ch newline ; display another newline

done ; display completion message
xor eax, eax ; exit with return code 0
ret

_MainProc ENDP

;------------------------------------------------------------

Adder PROC ; sample procedure

push ebp ; save base pointer
mov ebp, esp ; establish stack frame

;; push registers used by this proc N/A

;; proc code inserted here
mov eax, 0 ; initialize accumulator
add eax, DWORD PTR [ebp+8] ; add 1st parameter
add eax, DWORD PTR [ebp+12] ; add 2nd parameter

;; pop registers used by this proc N/A

pop ebp ; restore base pointer
ret

Adder ENDP

;----------------------------------------------------------------------

END ; end of source code

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.