本篇博客与博客50实现了相同的内容,但是这里使用的是从形式上来看相对比较简洁的Microsoft扩展伪指令,这样可以使得代码更加清晰,而且可以从中看出一些C++语言的影子
_arraysum.asm
;ArraySum过程 (_arraysum.asm)
include sum.inc
.code
;----------------------------------
ArraySum PROC,
ptrArray:PTR DWORD, ;数组指针
arraySize:DWORD ;数组大小
;
;计算32bit整数数组大小
;返回:EAX=和数
;----------------------------------
push ecx
push esi ;EAX不入栈
mov eax,0 ;和数清零
mov esi,ptrArray ;
mov ecx,arraySize ;
cmp ecx,0
jle L2
L1:
add eax,[esi] ;将每一个整数加到和数中
add esi,4 ;指向下一个整数
loop L1
L2:
pop esi
pop ecx
ret
ArraySum ENDP
END
_display.asm
;DisplaySum过程
include Sum.inc
.code
;----------------------------------
DisplaySum PROC,
ptrPrompt:PTR BYTE, ;提示字符串
theSum:DWORD ;数组之和
;
;在控制台显示和数
;返回:无
;----------------------------------
push eax
push edx
mov edx,ptrPrompt ;提示信息的指针
call WriteString
mov eax,theSum
call WriteInt
call Crlf
pop edx
pop eax
ret
DisplaySum ENDP
END
_prompt.asm
;提示输入请求
include sum.inc ;获得过程原型
.code
;------------------------------
PromptForIntegers PROC,
ptrPrompt:PTR BYTE, ;提示字符串
ptrArray:PTR DWORD, ;数组指针
arraySize:DWORD ;数组大小
;
;提示用户输入数组元素值,并用用户输入填充数组
;返回:无
;-------------------------------
pushad ;保存所有寄存器
mov ecx,arraySize
cmp ecx,0 ;数组大小<=0?
jle L2 ;是,退出
mov edx,ptrPrompt ;提示信息的地址
mov esi,ptrArray ;
L1:
call WriteString
call ReadInt
call Crlf
mov [esi],eax ;将读取到的数字存入数组
add esi,4 ;下一个数字
loop L1
L2:
popad ;恢复所有的寄存器
ret
PromptForIntegers ENDP
END
sum.inc
;(sum.inc)
include irvine32.inc
PromptForIntegers PROTO,
ptrPrompt:PTR BYTE, ;提示字符串
ptrArray:PTR DWORD, ;数组指针
arraySize:DWORD ;数组大小
ArraySum PROTO,
ptrArray:PTR DWORD, ;数组指针
arraySize:DWORD ;数组大小
DisplaySum PROTO,
ptrPrompt:PTR BYTE, ;提示字符串
theSum:DWORD ;数组之和
Sum_main.asm
;整数求和程序
include sum.inc
Count=3
.data
prompt1 byte "Enter a signed integers:",0
prompt2 byte "The sum of the integers is:",0
array DWORD Count DUP (?)
sum DWORD ?
.code
main PROC
call Clrscr
invoke PromptForIntegers,ADDR prompt1,ADDR array,Count
invoke ArraySum,ADDR array,Count
mov sum,eax
invoke DisplaySum,ADDR prompt2,sum
call Crlf
call WaitMsg
exit
main ENDP
END main