一)实验目的
- 学会安装“16位汇编程序开发软件”的安装,完成将汇编语言源程序录入进计算机、利用ml.exe进行汇编,LINK进行链接,并用DEBUG调试16位程序的全部过程。本实验大家不必了解程序细节,只是为了熟悉开发环境和上机过程。
二)实验内容
写16位汇编程序,从键盘输入一个字符串,然后换行后将该字符串输出到屏幕。
- 源程序
1 |
.8086 |
- 运行结果贴图
- 编程与调试心得(遇到的问题和解决的办法,以及获得的收获)
INT 21
的9号调用输出以DS:DX为首地址,”$”为结尾的字符串到显示器中。若要在显示字符串光标自动回车换行,则在”$”字符前面加上0DH(回车),0AH(换行)字符。
实验二 顺序程序设计
一)实验目的
通过这一部分的实验,进一步熟悉汇编过程和DEBUG调试过程;掌握用汇编语言编写顺序程序。
二)实验内容
写完整程序16位程序,在内存中从Table开始的10个单元中连续存放0到9的平方值,任给一个0到9的数X,该数存放在内存单元XX中,用XLAT指令查表求X的平方值,并将结果存于内存YY单元中。编写程序,并在DEBUG中进行调试和验证结果。(X,XX,YY都是内存中的变量)
- 源程序
1 |
.8086 |
- 运行结果贴图
可以看到DS:000A放的是09H,查找后AL中放的是51H=81D,存入YY=DS:000B中。
- 编程与调试心得(遇到的问题和解决的办法,以及获得的收获)
XLAT的指令功能:把待查表格的一个字节内容送到AL累加器中。在执行该指令前,应将Table先送至BX寄存器中,然后将待查字节与其在表格中距表首地址位移量送AL,即AL<–((BX)+(AL)). 执行XLAT将使待查内容送到累加器。
实验三 分支程序设计
一)实验目的
通过本实验,熟练运算类指令对标志位状态的影响,以及标志位状态的表示方法;掌握无条件转移、条件转移指令的使用方法;掌握分支程序设计和调试方法。
二)实验内容
所谓回文字符串是指一个字符串正读和倒读都是一样的,例如字符串‘ABCDEFFEDCBA’就是一个回文字符串,而字符串‘ABCFDDCAB’就不是回文字符串。现在编写完整的16位汇编程序,输入一个字符串,判断该字符串是否为回文字符串,并用“It is a palindrome”或“It is NOT a palindrome”作为输出。
- 源程序
1 |
.8086 |
- 运行结果贴图
- 编程与调试心得(遇到的问题和解决的办法,以及获得的收获)
- TRUE和FALSE字符串开头加0AH、0DH可以防止回车把输入冲掉
- 奇偶情况不同,并且两个字符的情况与其他的偶数情况不同
实验四 循环程序设计
一)实验目的
通过实验,可以掌握循环结构的各种实现方法,进一步了解循环结构中初始化部分、循环体部分、循环控制部分的功能以及他们彼此之间的关系。尤其是多重循环中外层循环和内层循环之间的关系。
二)实验内容
请编写16位完整汇编程序,在一个升序字节数组BUFF中查找数N,找到后将此数从数组中删除,并使得CF=0;没找到返回CF=1。
- 源程序
1 |
.8086 |
- 运行结果截图
- 编程与调试心得(遇到的问题和解决的办法,以及获得的收获)
八位寄存器中的两位十六进制数可以加减30H变成想要的ASCII码或者数字,十六位寄存器中的四位十六进制数可以加减3030H变成想要的ASCII码或者数字。
实验五 子程序设计
一)实验目的
通过本实验,掌握子程序的定义和调用方法。通过程序调试,进一步理解CALL指令和RET指令的功能,掌握子程序调用时参数传递的方法。
二)实验内容
- 请编写完整16位汇编程序从键盘读取字符,如果是十进制的‘0’~‘9’则在屏幕上输出该数的8位二进制码,并将数字依次存放到BUF开头的数组中,如果读入的字符是’Q’或者‘q’,则程序退出,其他情况在屏幕上打印“You must input 0~9, or ‘q’ or ‘Q’”。(如输入的字符是‘9’,则输出“00001001”).提示:输出一个数的2进制形式应该从最高位开始输出。要求打印一个数的2进制形式和输出回车换行分别定义成一个子程序可以将此段程序定义成一个过程。
- 源程序
1 |
.8086 |
- 运行结果截图
- 编程与调试心得(遇到的问题和解决的办法,以及获得的收获)
刚开始没想取余数从十六进制转到二进制,后来发现我也不知道什么太好的办法-_-|||
通过写这个程序,我对DIV有了更深的认识。
- Programming a sub routine to calculate N!. Specific requirements:Read a number N(1~6) from keyboard,programming a sub routine named DAC to calcute N!, then print the result to screen in decimal form.
- 源程序
1 |
.8086 |
- 运行结果截图
- 编程与调试心得(遇到的问题和解决的办法,以及获得的收获)
通过写这个程序,我对子程序设计更加熟悉。
- 在附加段中有一个从小到大排序的无符号数字数组,其首地址在DI中,数组的第一个单元存放数组长度。要求用折半查找法在数组中查找数N,假设该数已在AX中,如找到,CF=0,并在SI中给出该元素在数组中的偏移地址;如未找到,CF=1。
- 源程序
1 |
.8086 |
- 运行结果截图
- 编程与调试心得(遇到的问题和解决的办法,以及获得的收获)
我对二分查找的本质有了更深刻的理解,了解了ES的声明方式。
- 在内存中有一个数组,里面是放着10个学生的某科的成绩,分别是:85,73,92,66,91,98,52,87,83,68, 请用冒泡排序法将这10个数从大到小排序,并将排序的结果在屏幕上打印出来,要求一个数一行的格式输出。
- 源程序
1 |
.8086 |
- 运行结果贴图
- 编程与调试心得(遇到的问题和解决的办法,以及获得的收获)
要注意在排序的过程中对CX值的保存。以及数组元素大小比较。
但是很奇怪的是在我的==WindowsXP上的CMD中无法正确执行,但是在DOSBOX中可以执行==,所以。。。
原文:大专栏 计算机输入输出系统汇编实验报告 · 东南大学Linux俱乐部