汇编语言————实验2:多整数求和程序的编写

实验名称

多整数求和程序的编写

实验目的

熟悉汇编语言的基本指令和条件指令的使用,理解汇编程序中,如何实现高级语言中的条件语句。

实验要求

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

效果截图:

总结

在本次实验当中遇到了循环的使用、各种函数的使用、以及逻辑的掌握与控制交互,获益匪浅,同时在本次实验中也遇到了不少汇编时的错误信息,通过百度、查询书籍,找到了相应的解决方式,使得最后代码程序成功运行实现了最后的效果!

汇编中的功能函数的使用、以及调试是非常重要的学习内容,只有多实践才可以熟练掌握!

  • 7
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FLy_鹏程万里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值