实验名称
多整数求和程序的编写
实验目的
熟悉汇编语言的基本指令和条件指令的使用,理解汇编程序中,如何实现高级语言中的条件语句。
实验要求
1) 编写多个整数求和的程序:对用户输入的多个整数进行求和,并输出结果。
阅读然后修改附录A中的求和程序(该程序实现了3个整数求和的功能),使用一个常量决定数组的大小(即程序最大可以求和的整数个数):
ARRAY_SIZE = 20
Array DWORD ARRAY_SIZE DUP(?)
写一个过程提示用户输入需要求和的整数的个数,向promptForIntegers过程传递用户输入的数值。如果用户的输入值大于ARRAY_SIZE(判断的示例代码参见附录B),那么显示一条错误信息并退出程序。提示和错误信息可以如下例所示:
How many integers will be added? 21
The array cannot be larger than 20
精心设计程序,使得在修改了ARRAY_SIZE后,错误提示信息中的ARRAY_SIZE数目值(在上例中是20)也应自动修改。
提示:
a). 编程能力一般的同学可以分两步:①弄懂附录A的程序。该程序实现了3个整个求和的功能。 ②找到附录A的程序需要修改的地方,以实现多个整数求和。
b). 编程能力较强的同学建议直接编写程序实现。
2) 对上述程序添加功能:除显多个整数的和外,还分别显示这些整数中正整数的和负整数的和。(区分正数与负数的示例代码参见附录B)
3)(可选)阅读kip irvine库中的部分过程的源码
Irvine 32位库的源码在文件Irvine32.asm中(在Irvine32_Library_sourceCode.rar压缩包中)。
建议阅读源码的过程是:DumpMem,DumpRegs,IsDigit,Random32,RandomRange,ReadChar,
实验内容
1、实现多个整数求和
代码如下:
TITLE Integer Summation Program
INCLUDE Irvine32.inc
ARRAY_SIZE = 20 ;定义最多可以进行多少个整数的运算
.data
str1 BYTE "Enter a signed integer:",0
str2 BYTE "The sum of the integers is:",0
str3 BYTE "How many integers will be added? ",0
str4 BYTE "The array cannot be larger than 20",0ah,0
array DWORD ARRAY_SIZE DUP(?)
.code
main PROC
call Clrscr ;调用功能函数Clrscr清除控制台
mov esi,OFFSET array ;将数组的地址传至esi寄存器中
mov ecx,ARRAY_SIZE ;将定义的最大数组大小存放到ecx寄存器中
call panduan ;调用函数panduan来判断用户要求输入的运算数的数目是否大于最大限制
call PromptForIntegers
call ArraySum
call DisplaySum
exit
main endp
panduan PROC USES edx
mov edx,OFFSET str3 ;将str3字符串的首地址存放到edx寄存器中
call WriteString ;向控制台输出一个以空字节结束的字符串(str3)
call ReadInt ;从键盘读入一个32位有符号整数
call Crlf ;将光标定位到控制台窗口下一行位置
mov ebx,20 ;将20(最大允许操作的数据数量)赋值给ebx中
cmp ebx,eax ;将用户输入的要处理的数据数目与系统定义的最大可以处理数据数量进行比较
mov edi,eax
JNC L1 ;当用户要求处理的数据数量大于最大可以处理数量时进行跳转
mov edx,OFFSET str4 ;将str4字符串的首地址传给edx
call WriteString ;在控制台显示字符串str4
exit
L1: ret
panduan ENDP
PromptForIntegers PROC USES ecx edx esi ;实现接受输入数字
mov edx,OFFSET str1 ;将字符串str1的首地址传给edx
mov ecx,edi
L1: call WriteString ;在控制台显示字符串str1
call ReadInt ;接受用户从键盘输入的一个数值
call Crlf ;实现回车换行
mov [esi],eax ;将eax的值赋值给esi
add esi,TYPE DWORD
loop L1 ;循环
ret
PromptForIntegers ENDP
ArraySum PROC USES esi ecx ;求和
mov eax,0
L1: add eax,[esi]
add esi,TYPE DWORD
loop L1
ret
ArraySum ENDP
DisplaySum PROC USES edx ;显示最后的和
mov edx,OFFSET str2
call WriteString
call WriteInt
call Crlf
ret
DisplaySum ENDP
END main
运行结果显示:
2、实现多个整数求和并且输出正数、负数的和
实现代码:
TITLE Integer Summation Program
INCLUDE Irvine32.inc
ARRAY_SIZE = 20
.data
str1 BYTE "Enter a signed integer:",0
str2 BYTE "The sum of the positive integers is:",0
str3 BYTE "How many integers will be added? ",0
str4 BYTE "The array cannot be larger than 20",0ah,0
str5 BYTE "The sum of the negative integers is:",0
array DWORD ARRAY_SIZE DUP(?)
.code
main PROC
call Clrscr
mov esi,OFFSET array
mov ecx,ARRAY_SIZE
call panduan
call PromptForIntegers
call ArraySum
call DisplaySum
exit
main endp
panduan PROC USES edx ;判断用户待输入的数据数量是否大于系统可以接受的数据处理数量
mov edx,OFFSET str3
call WriteString
call ReadInt
call Crlf
mov ebx,20
cmp ebx,eax
mov edi,eax
JNC L1
mov edx,OFFSET str4
call WriteString
exit
L1: ret
panduan ENDP
PromptForIntegers PROC USES ecx edx esi ;接受输入的处理数据
mov edx,OFFSET str1
mov ecx,edi
L1: call WriteString
call ReadInt
call Crlf
mov [esi],eax
add esi,TYPE DWORD
loop L1
ret
PromptForIntegers ENDP
ArraySum PROC USES esi ecx ;进行求和运算
mov eax,0
mov ebx,0
mov edx,0
L1: cmp [esi],edx
jl L2
add eax,[esi]
jmp L3
L2: add ebx,[esi]
L3: add esi,TYPE DWORD
loop L1
ret
ArraySum ENDP
DisplaySum PROC USES edx ;显示最后的和
mov edx,OFFSET str2
call WriteString
call WriteInt
call Crlf
mov edx,OFFSET str5
mov eax,ebx
call writestring
call writeint
call Crlf
ret
DisplaySum ENDP
END main
效果截图:
总结
在本次实验当中遇到了循环的使用、各种函数的使用、以及逻辑的掌握与控制交互,获益匪浅,同时在本次实验中也遇到了不少汇编时的错误信息,通过百度、查询书籍,找到了相应的解决方式,使得最后代码程序成功运行实现了最后的效果!
汇编中的功能函数的使用、以及调试是非常重要的学习内容,只有多实践才可以熟练掌握!