汇编实验五--DOS功能调用(共19页)_第1页
汇编实验五--DOS功能调用(共19页)_第2页
汇编实验五--DOS功能调用(共19页)_第3页
汇编实验五--DOS功能调用(共19页)_第4页
汇编实验五--DOS功能调用(共19页)_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选优质文档-倾情为你奉上福建农林大学东方学院信息工程类实验报告系: 计算机系 专业: 电子信息工程 年级: 10 姓名: 廖少兵 学号: 实验课程: 汇编语言 实验室号:_ 实验设备号: 实验时间: 指导教师签字: 成绩: 实验五 DOS功能调用1实验目的和要求1. 学会DOS中关于显示功能调用指令的用法。2. 领会修改显存方法显示字符。2实验用的软硬件环境实验的硬件环境是:IBMPC机及其兼容机实验的软件环境是: 操作系统:DOS 2.0以上;调试程序:DEBUG.COM;文本编程程序:EDIT.EXE、WPS.EXE;宏汇编程序:MASM.EXE(或ASM .EXE);连接装配程序:LI

2、NK .EXE;交叉引用程序:CREF.EXE(可有可无)。3实验内容及实验数据记录1、 输入一个字符,显示出来2、 输入一个字符串,显示出来3、 buf开始的3个的16位二进制数用十六进制数的形式显示出来(1)理解程序(2)输入程序,汇编,运行(在DOS状态下输入:文件名.EXE),观察结果。(3)如果要分行显示,程序要如何修改?DATASEGMENTBUFDW4F59H, 56A8H, 0FF90HDATAENDSCODESEGMENTASSUMECS: CODE, DS: DATASTART:MOVAX, DATA MOVDS, AX MOVSI, 0P:MOVBX, BUFSI MOV

3、CH, 4L:MOVCL, 4 ROLBX, CL MOVDL, BL ANDDL, 0FH CMPDL, 10 JBNEXT ADDDL, 7NEXT:ADDDL, 30H MOVAH, 2 INT21H DECCH JNZL INCSI INCSI CMPSI, 4 JNAP MOVAH, 4CH INT21HCODE ENDSENDSTART4、 运行下列程序,在屏幕的第1行,会显示一个字符X,理解程序段STACK SEGMENT DB 128 DUP(0)STACK ENDSCODE SEGMENT ASSUME CS:CODE,SS:STACKSTART: MOV AX,STACK

4、MOV SS,AX MOV SP,128 MOV AX,0B800H MOV ES,AX MOV AH,0 ;BIOS 10H的0号功能,设置80X25的彩色字符模式 MOV AL,03H INT 10H MOV AH,'X' MOV ES:160*1+40*2,AH MOV AL,0 MOV AH,4CH INT 21HCODE ENDS END START5、 显示*6、 编写程序,统计字缓冲区中的20个数据的正数、负数、0的个数,并将统计结果以16进制形式显示出来。4操作方法及实验步骤1)直接调用DOS 1号功能即可,debug环境中a命令直接编辑代码写入内存如下指令MO

5、VAH,01INT21HMOVAH,4CINT21H2)字符串的输入和显示,原以为在调用10号功能后需要调用9号显示功能,因此编辑代码如下DATA SEGMENTBUF DB 10 DB ?DB 10 DUP(?);DB '$'DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOVAX,DATAMOV DS,AXMOV DX,OFFSET BUFMOV AH,10INT 21H;MOV DX,OFFSET BUF+2;MOV AH,9;INT 21HMOV AH,4CHINT 21HCODE ENDSEND START3)3.1

6、&3.2我们知道要将数以16进制的形式显示就必须找到其对应的字母ABCDEF的ASCII码,ASCII码48是数字0的开始也就是16进制中的30,而3AH开始至40H为7个常用符号的ASCII码值,从41H开始才是大写字母的ASCII码值,因此将所要转化的四位二进制数与10做比较,若小于10可直接加30H得到其对应的ASCII码,若大于等于10则应多加上7跳过7个符号ASCII码得到其对应的16进制ASCII码以达到转换的目的即显示时打印其相应的ASCII码对应的字符。3.3要达到题目要求的分行显示,从程序的跟踪可以看出在在取数时分为了两个情况,一个通过SI定位内存单元一次性取得一个1

7、6位二进制数,另一个是处理数据时循环移位取高四位数。而要使得数据显示时换行只要在完成一个16位数据的转换后取下一个16位数时进行调用DOS 2号功能输出换行符ASCII码为10即0AH便可。所以在源代码的基础上在两次INC SI前JNZL间添加指令如下MOV DL,0AHMOV AH,2INT 21H 4)可以看到程序首先通过MOV AX,0B800HMOV ES,AX在内存开辟了附加段,段首地址为B800H并通过MOV ES:160*1+40*2,AH以便于向B80F0H(位于B8000HBFFFFH彩色字符模式显示缓冲区)执行MOV AH,'X'写入字符X,以达到直接改变显

8、存内容显示。5) 5.1分析图案第1行打印了9列 *第2行打印了7列 *第3行打印了5列 *第4行打印了3列 *第5行打印了1列 *因此有两种思路,一是通过调用DOS 2号功能配合循环逐一打印字符'*',二是借鉴4)中的方法直接改变内存内容显示'*'。但两种方法都用到了双重循环,外层循环控制行的打印,内层循环控制列的打印。结合图案分析和循环数与行序号不然找到如下关系:a、1<=列数<= 2*当前行序号-1而行控制参是外层循环CX的变动,所以有b、6-CX=当前行序号。5.2这里选择第二种以熟悉并掌握4)中的方法首先按a和b式,就有了偏移地址的计算式:

9、160*(6-CX)+2*Y。其中1<=Y<=2*CX-1,可通过内层循环实现。5.4因此有最初代码(错误)STACKSEGMENTDB128 DUP(0)STACK ENDSCSEGSEGMENTASSUME CS:CSEG,SS:STACKSTART:MOV AX,STACKMOV SS,AXMOV SP,128MOV AX,0B800HMOV ES,AX ;段装入MOV CL,5;循环控制次数为5MOV CH,0 ;高位清零MOV DH,'*'初始打印字符MOV AX,0H:;MOV BL,1 ;从1列开始显示MOV DL,6;行控制参数SUB DL,CL;控

10、制当前行MOV AL,160MUL DLMOV DI,AX ;保存行参数MOV AL,2 MUL CLDEC AL(L:)MOV AL,2MUL BL;控制当前列ADD AX,DI;显存空间定位MOV ES:AX,DH;通过显存显示INC BL;列打印自加;INC BX(L:)MOV AL,2 MUL CLDEC AL;DEC AX ;MOV SI,AXCMP BL,AL;检验打印上限;CMP BX,SIJNA L;未打印完当前行返回继续打印MOV DL,0AHMOV AH,2INT 21H ;打印完一行则换行LOOP H;行打印循环MOV AH,4CHINT 21H;退出到DOS界面CSEG

11、ENDSEND START6)6.1分析题目要求有三,首先定义缓冲区存放20个有符号数据,其次对于正负数和零的统计可通过两次筛选来完成,最后是16进制的转换这在3)中已得以解决,因此有部分流程如下这样在16进制转换时就有了一个取数的麻烦,为此考虑如果多开辟一个缓冲区BUF2来存放三个结果,下一个指针DI,一来解决了这个问题,二来筛选时通过指针的跳动也同时使得统计结果的代码得以简化,所以就有了如下流程: 6.2按分析结合流程编辑代码如下DATA SEGMENTBUF1 DB 1,-3,5,26,0,6,0,24,-17,-10, -21,-5,33,48,0,32,0,10,44,-1 BUF2

12、 DB 3DUP(0)DATA ENDSCODE SEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOV DS,AXMOV CX,20MOV AL,0;MOV SI,OFFSET BUF1(1) ;MOV DI,OFFSET BUF2S:CMP SI,ALJGENEXTCMPJMP ADDD;负数的个数NEXTCMP:INC DICMP SI,ALJZADDD;零的个数INC DIADDD:ADDBYTE PTR DI,1;正数的个数INC SILOOPS;统计个数MOV DI,OFFSET BUF2P:MOV BX,DI;以下为16进制的转换并显示注释

13、参考3)见附录MOV CH,4;L:MOV CL,4ROL BX,CL;ROL BL,CLMOV DL,BLAND DL,0FHCMP DL,10JBNEXTADD DL,7NEXT:ADD DL,30HMOV AH,2INT 21HDEC CHJNZLMOV AH,0AH;MOV AH,2;MOV DL,0AHINT 21HINC DICMPDI,OFFSET BUF2+2JNAPMOV AH,4CHINT 21HCODEENDSEND START5实验数据处理和分析2)按最初想法汇编程序得到了下面可怕的结果由此单步跟踪观察,d定位到输入的字符串所在查看,如图得知10号功能的调用并没出错,所

14、以应该是9号的问题单步到9号功能调用指令,p执行后,发现在debug确实调用,并显示了字符串但在返回DOS界面却显示先前的一大堆乱码,所以认为是结束字符'$'的关系,于是修改字符缓冲区为如下BUF DB 10 DB ?DB 10 DUP(?)DB '$'结果出现了如下情况,只要输入的字符少于9个都会缺失掉前面几个不唯一。至于问题处在哪,琢磨了好一段时也没弄清楚,猜想是10号功能的调用是否已自动回显了字符串而立刻调用9号功能是不是产生了覆盖。于是注释9号功能的调用。结果单一的10号功能的调用就已会显了字符串,符合题目要求。3)3.1-1debug调试,单步跟踪如图

15、程序进行取数操作:不难理解,程序首先通过循环左移4位将数据高4位(二进制数)移出并补到数据低位,再将内存中一单元的数据(数的低8位二进制数 )传送至寄存器DL如上图。3.1-2数据处理操作通过指令AND DL,0FH将高四位清零保留低四位如图a可以看到DX由0094变为了0004,至此取得二进制数的最高四位。将所要转化的四位二进制数与10做比较,若小于10即0到9可直接加30H得到其对应的ASCII码30H到39H如图b所示,相反若大于等于10则应多加上7跳过7个符号ASCII码得到其对应的16进制ASCII码41H到46H以达到转换的目的即显示时打印其相应的ASCII码对应的字符。图a图b3

16、.2输入程序,编译,连接,运行结果如下虽然达到了以16进制的形式打印要求却连续输出了三个数。图c4)立即的显示结果混在了debug环境其他字符中,以至于没能注意到,老怀疑是自己显卡的显存空间分配彩色字符缓冲区不在内存的B8000HBFFFFH间,导致了随机更改ES段首地址,结果可想而知,无意清屏时直接在DOS下运行终于看到了字符X。5)5.1间接寻址,MOV ES:AL,DH寄存器的错误应用即相对适用的寄存器只有BX,BP,SI和DI错误提示如下 通过添加ADD AX,DI 和 MOV DI,AX 指令,写入字符指令相应地改为了MOV ES:DI,DH。5.2更正了错误后并排错语法错误后运行结

17、果仍然出现问题如下结果并没有如预期的一样,从图案可以看出,错误肯定是在于列打印的控制上,debug单步跟踪发现DI中保存的参数在每次打印时都更新为了前一次打印所计算的偏移地址也就是加上了列的增量,如下图所示,打印1行2列时,DI由00A2H即162变成了00A6即166。5.3因此在下一行打印之前必须保证DI不变动,所以这里的DI应由其他寄存器代替,便修改之为BP,编译运行也就得到了预期的图案。6)汇编代码出错如下修改错误,保证语法的正确性后,运行程序得到结果如下,显然dos2号功能调用出错了,统计结果也不正确,为此只能单步跟踪在第一次循环时过程和数据处理均正常如下图a第一个数第一次筛选图b第

18、一个数为大于等于0,DI下移图c第一个数大于0,DI继续下移一位至0016,实现结果加1继续跟踪发现,问题出在了每次处理完一个数据后DI未能刷新至原点0014图下修改S:标号至(1)处,MOV DI,OFFSET BUF2得到结果如下不难发现,除了dos2号功能未修改错外,结果中后两位才是正确的结果,检查代码得知是16进制转换时寄存器高8位无用数据参与了转换,为此修改P:MOV BX,DIMOV CH,4L:MOV CL,4ROL BX,CL为P:MOV BX,DIMOV CH,2L:MOV CL,4ROL BL,CL问题想是可以得以解决。重新汇编,并运行程序。6. 实验结果1)G运行后提示符提示输入字符,结果如下回显输入的字符2)DOS 10号功能调用,输入字符串到自定义的缓冲区内,并会显字符串到屏幕,如下a为debug下,b为dos界面下。图a图b3)未进行换行操作换行后显示结果如下4)通过MOV ES:160*1+40*2,AH向B80F0H写入字符'X',立即显示结果如下5)5

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论