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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值