欢迎来到冰豆网! | 帮助中心 分享价值,成长自我!
冰豆网
全部分类
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • 党团工作>
  • ImageVerifierCode 换一换
    首页 冰豆网 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    汇编实验五DOS功能调用.docx

    • 资源ID:4932839       资源大小:203.22KB        全文页数:18页
    • 资源格式: DOCX        下载积分:12金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要12金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    汇编实验五DOS功能调用.docx

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

    2、;连接装配程序:LINK .EXE;交叉引用程序:CREF.EXE(可有可无)。3实验内容及实验数据记录1、 输入一个字符,显示出来2、 输入一个字符串,显示出来3、 buf开始的3个的16位二进制数用十六进制数的形式显示出来(1)理解程序(2)输入程序,汇编,运行(在DOS状态下输入:文件名.EXE),观察结果。(3)如果要分行显示,程序要如何修改? DATA SEGMENT BUF DW 4F59H, 56A8H, 0FF90H DATA ENDS CODE SEGMENT ASSUME CS: CODE, DS: DATA START: MOV AX, DATA MOV DS, AX M

    3、OV SI, 0 P: MOV BX, BUFSI MOV CH, 4 L: MOV CL, 4 ROL BX, CL MOV DL, BL AND DL, 0FH CMP DL, 10 JB NEXT ADD DL, 7 NEXT: ADD DL, 30H MOV AH, 2 INT 21H DEC CH JNZ L INC SI INC SI CMP SI, 4 JNA P MOV AH, 4CH INT 21H CODE ENDS END START4、 运行下列程序,在屏幕的第1行,会显示一个字符X,理解程序段STACK SEGMENT DB 128 DUP(0)STACK ENDSC

    4、ODE SEGMENT ASSUME CS:CODE,SS:STACKSTART: MOV AX,STACK 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操作方法及实验步

    5、骤1)直接调用DOS 1号功能即可,debug环境中a命令直接编辑代码写入内存如下指令MOV AH,01INT 21HMOV AH,4CINT 21H2)字符串的输入和显示,原以为在调用10号功能后需要调用9号显示功能,因此编辑代码如下DATA SEGMENTBUF DB 10 DB ? DB 10 DUP(?) ;DB $DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX MOV DX,OFFSET BUF MOV AH,10 INT 21H ;MOV DX,OFFSET BUF+2 ;MOV AH

    6、,9 ;INT 21H MOV AH,4CH INT 21HCODE ENDS END START3)3.1&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要达到题目要

    7、求的分行显示,从程序的跟踪可以看出在在取数时分为了两个情况,一个通过SI定位内存单元一次性取得一个16位二进制数,另一个是处理数据时循环移位取高四位数。而要使得数据显示时换行只要在完成一个16位数据的转换后取下一个16位数时进行调用DOS 2号功能输出换行符ASCII码为10即0AH便可。所以在源代码的基础上在两次INC SI前JNZ L间添加指令如下 MOV DL,0AH MOV AH,2 INT 21H 4)可以看到程序首先通过 MOV AX,0B800H MOV ES,AX在内存开辟了附加段,段首地址为B800H并通过MOV ES:160*1+40*2,AH以便于向B80F0H(位于B8

    8、000HBFFFFH彩色字符模式显示缓冲区)执行MOV AH,X写入字符X,以达到直接改变显存内容显示。 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)中的方

    9、法 首先按a和b式,就有了偏移地址的计算式:160*(6-CX)+2*Y。其中1=Y=2*CX-1,可通过内层循环实现。5.4因此有最初代码(错误)STACK SEGMENT DB 128 DUP(0)STACK ENDSCSEG SEGMENT ASSUME CS:CSEG,SS:STACKSTART: MOV AX,STACK MOV SS,AX MOV SP,128 MOV AX,0B800H MOV ES,AX ;段装入 MOV CL,5 ;循环控制次数为5 MOV CH,0 ;高位清零 MOV DH,* ;初始打印字符 MOV AX,0 H: ;MOV BL,1 ;从1列开始显示 M

    10、OV DL,6 ;行控制参数 SUB DL,CL ;控制当前行 MOV AL,160 MUL DL MOV DI,AX ;保存行参数 MOV AL,2 MUL CL DEC AL(L:) MOV AL,2 MUL BL ;控制当前列 ADD AX,DI ;显存空间定位 MOV ES:AX,DH ;通过显存显示 INC BL ;列打印自加 ;INC BX(L:) MOV AL,2 MUL CL DEC AL ;DEC AX ;MOV SI,AX CMP BL,AL ;检验打印上限 ;CMP BX,SI JNA L ;未打印完当前行返回继续打印 MOV DL,0AH MOV AH,2 INT 21

    11、H ;打印完一行则换行 LOOP H ;行打印循环 MOV AH,4CH INT 21H ;退出到DOS界面CSEG ENDS END START6)6.1分析题目要求有三,首先定义缓冲区存放20个有符号数据,其次对于正负数和零的统计可通过两次筛选来完成,最后是16进制的转换这在3)中已得以解决,因此有部分流程如下这样在16进制转换时就有了一个取数的麻烦,为此考虑如果多开辟一个缓冲区BUF2来存放三个结果,下一个指针DI,一来解决了这个问题,二来筛选时通过指针的跳动也同时使得统计结果的代码得以简化,所以就有了如下流程: 6.2按分析结合流程编辑代码如下DATA SEGMENTBUF1 DB 1

    12、,-3,5,26,0,6,0,24,-17,-10, -21,-5,33,48,0,32,0,10,44,-1 BUF2 DB 3DUP(0)DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX MOV CX,20 MOV AL,0 ;MOV SI,OFFSET BUF1(1) ;MOV DI,OFFSET BUF2S: CMP SI,AL JGE NEXTCMP JMP ADDD ;负数的个数NEXTCMP:INC DI CMP SI,AL JZ ADDD ;零的个数 INC DIADDD: ADD

    13、BYTE PTR DI,1 ;正数的个数 INC SI LOOP S ;统计个数 MOV DI,OFFSET BUF2P: MOV BX,DI;以下为16进制的转换并显示注释参考3)见附录 MOV CH,4;L: MOV CL,4 ROL BX,CL ;ROL BL,CL MOV DL,BL AND DL,0FH CMP DL,10 JB NEXT ADD DL,7NEXT: ADD DL,30H MOV AH,2 INT 21H DEC CH JNZ L MOV AH,0AH ;MOV AH,2 ;MOV DL,0AH INT 21H INC DI CMP DI,OFFSET BUF2+2

    14、JNA P MOV AH,4CH INT 21HCODE ENDS END START5实验数据处理和分析2)按最初想法汇编程序得到了下面可怕的结果由此单步跟踪观察,d定位到输入的字符串所在查看,如图得知10号功能的调用并没出错,所以应该是9号的问题单步到9号功能调用指令,p执行后,发现在debug确实调用,并显示了字符串但在返回DOS界面却显示先前的一大堆乱码,所以认为是结束字符$的关系,于是修改字符缓冲区为如下BUF DB 10 DB ? DB 10 DUP(?) DB $结果出现了如下情况,只要输入的字符少于9个都会缺失掉前面几个不唯一。至于问题处在哪,琢磨了好一段时也没弄清楚,猜想是1

    15、0号功能的调用是否已自动回显了字符串而立刻调用9号功能是不是产生了覆盖。于是注释9号功能的调用。结果单一的10号功能的调用就已会显了字符串,符合题目要求。3)3.1-1debug调试,单步跟踪如图程序进行取数操作:不难理解,程序首先通过循环左移4位将数据高4位(二进制数)移出并补到数据低位,再将内存中一单元的数据(数的低8位二进制数 )传送至寄存器DL如上图。3.1-2数据处理操作通过指令AND DL,0FH将高四位清零保留低四位如图a可以看到DX由0094变为了0004,至此取得二进制数的最高四位。将所要转化的四位二进制数与10做比较,若小于10即0到9可直接加30H得到其对应的ASCII码

    16、30H到39H如图b所示,相反若大于等于10则应多加上7跳过7个符号ASCII码得到其对应的16进制ASCII码41H到46H以达到转换的目的即显示时打印其相应的ASCII码对应的字符。图a图b3.2输入程序,编译,连接,运行结果如下虽然达到了以16进制的形式打印要求却连续输出了三个数。图c 4)立即的显示结果混在了debug环境其他字符中,以至于没能注意到,老怀疑是自己显卡的显存空间分配彩色字符缓冲区不在内存的B8000HBFFFFH间,导致了随机更改ES段首地址,结果可想而知,无意清屏时直接在DOS下运行终于看到了字符X。 5) 5.1间接寻址,MOV ES:AL,DH寄存器的错误应用即相

    17、对适用的寄存器只有BX,BP,SI和DI错误提示如下 通过添加ADD AX,DI 和 MOV DI,AX 指令,写入字符指令相应地改为了MOV ES:DI,DH。 5.2更正了错误后并排错语法错误后运行结果仍然出现问题如下结果并没有如预期的一样,从图案可以看出,错误肯定是在于列打印的控制上,debug单步跟踪发现DI中保存的参数在每次打印时都更新为了前一次打印所计算的偏移地址也就是加上了列的增量,如下图所示,打印1行2列时,DI由00A2H即162变成了00A6即166。 5.3因此在下一行打印之前必须保证DI不变动,所以这里的DI应由其他寄存器代替,便修改之为BP,编译运行也就得到了预期的图

    18、案。 6)汇编代码出错如下修改错误,保证语法的正确性后,运行程序得到结果如下,显然dos2号功能调用出错了,统计结果也不正确,为此只能单步跟踪在第一次循环时过程和数据处理均正常如下图a第一个数第一次筛选图b第一个数为大于等于0,DI下移图c第一个数大于0,DI继续下移一位至0016,实现结果加1继续跟踪发现,问题出在了每次处理完一个数据后DI未能刷新至原点0014图下修改S:标号至(1)处,MOV DI,OFFSET BUF2得到结果如下不难发现,除了dos2号功能未修改错外,结果中后两位才是正确的结果,检查代码得知是16进制转换时寄存器高8位无用数据参与了转换,为此修改P: MOV BX,D

    19、I MOV CH,4L: MOV CL,4 ROL BX,CL为P: MOV BX,DI MOV CH,2L: MOV CL,4 ROL BL,CL问题想是可以得以解决。重新汇编,并运行程序。6. 实验结果1)G运行后提示符提示输入字符,结果如下回显输入的字符 2)DOS 10号功能调用,输入字符串到自定义的缓冲区内,并会显字符串到屏幕,如下a为debug下,b为dos界面下。图a图b 3)未进行换行操作换行后显示结果如下 4)通过MOV ES:160*1+40*2,AH向B80F0H写入字符X,立即显示结果如下 5) 5.1修改DI变动的问题后,运行结果和预期的差不多,但由于是通过显存修改来

    20、显示,之前的内容未被清零,就出现了覆盖现象如下对此,只要修改首列显示位置,及列显示上限即可,于是修改MOV BL,1 为MOV BL,35(从35列开始打印),修改 DEC AX 和MOV SI,AX为ADD AX,34结果是整体移动了位置,却又出现了错误的图案如下原本一个简单的加法,因被我忽略了未修改时起始位子1,而多加了一个打印上限,被弄的晕头转向的,最终还是在debug单步运行时发现了问题所在。修改34为33,终于得到了正确的结果如图 6)分析并修改一系列错误后,更正DOS 2号功能调用输出换行符,得到预期结果如下,其中一行为负数个数,二行为0的个数,三行为正数个数。7. 质疑,建议,问题讨论和总结此次实验是上机以来花了最长时间的一次,从分析各个程序,单步跟踪来理解程序的个步骤及作者的整体思路,加之利用所学分析并解决问题,让我更深入的看到了设计一个程序的思路的严谨的重要性,其中修改显存显示的方法让我掌握了一个简单却实用的DOS调用功能,而通过5)要求的再一次利用与实现使我对其认识更进一层,通过自己分析5)和6)的问题转换为数学逻辑表达式使得本繁杂的程序得以很大程度上得以简化,总之长时间的付出并没白费,虽然其中确实不甘心一次openoffice崩溃导致文档的从头重新编写,不过还算顺利完成了任务,也给自己一个不备份文件的教训了。


    注意事项

    本文(汇编实验五DOS功能调用.docx)为本站会员主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2022 冰点文档网站版权所有

    经营许可证编号:鄂ICP备2022015515号-1

    收起
    展开