052.使用invoke以及proto新建模块的方法

        本篇博客与博客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
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、下4载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、下4载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、 4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值