实验目的
- 掌握程序设计中的3种基本结构(顺序结构、选择程序、循环程序)。
- 熟练使用汇编语言的指令:数据传送类指令、数据运算类指令、逻辑判断类指令与转移指令、循环指令等。
- 初步了解系统功能调用的使用方法,尝试使用
01H
号功能调用进行字符输入的方法及使用02H
号功能调用进行字符输出(显示)的方法。
程序说明
- 计算1+2+3+…+10,将结果显示在屏幕上。
- 利用
01H
号功能调用输入10个一位数字,并将其由ASCII码转换为二进制数,依此保存到变量BUF
的10个字节中,变量BUF
的形式为BUF DB 10 DUP(?)
。编程求出这10个数中的最大数和最小数,将最大数存入MAX
单元、最小数存入MIN
单元,并将其在屏幕上显示出来。
设计思想
题目一
如下图所示,首先通过循环求出1+2+…+10,然后调用子程序display
显示sum
。
题目二
如下图所示,首先调用子程序getinput
获取用户输入,同时存储进数组,并更新max
和min
,最后调用两次子程序display
显示max
和min
。
程序代码
题目一
1 | ;********************************************************************* |
题目二
1 | ;********************************************************************* |
问题回答
设计的程序包含了几个段
题目一和题目二的程序各设计了两个段:数据段和代码段。
你的代码经过编译和链接之后,总共占用多少个字节
题目一和题目二程序编译链接后大小均为1KB。
调用DEBUG进行反汇编,查看程序的第一条指令的地址码是多少?最后一条指令的地址码是多少?
- 题目一第一条指令的地址码为
076B:0000
,最后一条指令的地址码为076B:0018
。因为使用了一个子程序,所以主程序较短。 - 题目二第一条指令的地址码为
076B:0000
,最后一条指令的地址码为076B:001E
。因为使用了两个子程序,所以主程序较短。
对于第2题,怎样修改程序可以同时实现将10个数字的累加功能
- 首先在数据段中定义变量,代码如:
sum db 0
; - 然后在
getinput
子程序中savetoarray
中sub al,30h
后添加代码add sum,al
。
对于第2题,若要求输入的是两位数,又该怎么办?
- 首先
(cx)
改为20; - 然后每两个数字一组:其中先得到的数字转换为十进制数字
A
暂存,后得到的数字转换成十进制数字B
暂存; - 可知我们要操作的数字为
A*10+B
(可以通过乘法和加法实现); - 其他程序不变。
结果分析
题目一
运行程序,可见输出了1+2+…+10=55。
题目二
运行程序,输入9876543210共10个数字,可见输出了最大值9和最小值0。
查看数据段dds:0
,结果如下,可知数字均已存入buf
数组。
作者:@臭咸鱼
转载请注明出处:https://chouxianyu.github.io
欢迎讨论和交流!