




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、信息与通信工程学院微机原理软件实验报告(二)班级:姓名: 学号:序号: 日 期: 2014年 12月一、实验目的1)掌握 MASM 的操作步骤,能够将源程序编译成可执行文件2)掌握简单的DOS功能调用3)掌握简单的汇编语言程序的设计二、实验任务1. 编一程序,在显示器上显示256个ASCII代码,要求显示格式为每行显示16个字符,两个ASCII字符间空一格。2. 试编一程序,把地址偏移量为 100H 单元开始的 256 个单元分别写入: 00H,01 H,02H,03H,FFH 数据。统计写入的数据块中 0 元素、正元素、负元素的个数,并分别把 统计结果送人上述数据块之后的三个单元中。用DOS
2、功能调用显示上面两题中数据块各单元(包括统计结果)内容。为了显示清晰明了,要求每行显示 16 个数据,两个数据之间用空格分开。(教材P185第1、2、3题合到一起编一完整的程序。)3. 编一程序,把键入的十六进制数转换成十进制数并在屏幕上显示出来。 键入的最大数为 FFFFH,若键人的不是十六进数字,则显示出错提示。(教材P188第21题。)三、实验内容1. 显示256个ASCII码(1) 源程序(附注释):data segment ;定义数据段buf db 256 dup (?)count equ $-buf ;将buf定义的字节长度赋值给countdata endscode segment
3、 ;定义代码段assume ds:data,cs:codestart:mov ax,data mov ds,axmov si,offset buf ;设置数据块首地址mov cx,count ;设定循环次数cld ;地址修改为增量 xor ax,ax xor dx,dx xor bx,bxhyone:mov si,al ;将数据存入数据段 inc si inc alloop hyonemov si,offset buf ;指向数据块首地址 mov cx,count-1hytwo: mov dl,si ;显示数据段的内容 mov ah,2 int 21h mov dl,20h ;插入空格mov
4、ah,2int 21hinc si inc bl ;设定为换行指示标志 cmp bl,10h ;当显示了16个字符之后就换行 jz hythree loop hytwo;回车换行hythree: mov dl,0dh mov ah,02h int 21h mov dl,0ah mov ah,02h int 21h xor bl,bl ;将换行指示标志重新置为0 cmp cx,0 ;判断是否显示完 jnz hytwo ;没有显示完的话继续显示 jz hyfour ;显示完结束程序hyfour: mov ah,4ch ;终止程序 int 21hcode ends end start (2)程序流程
5、图: 图12. 写入数据,统计各类元素个数(1) 源程序(附注释):data segment ;定义数据段org 100h;设定初始偏移量为100hbuf db 259 dup(?) ;定义259个数据存放地址count equ $-buf;将buf定义的字节长度赋值给counthy db 0 ;定义变量hy作为空格显示控制标志data endscode segment ;定义代码段 assume cs:code,ds:datastart: mov ax,data mov ds,ax mov si,offset buf ;设置数据块首地址 mov cx,count-3 ;将循环次数存入cx中
6、cld;地址修改为增量 xor bx,bx xor ax,ax xor dx,dxhyone: movsi,al ;将数据存入数据段 inc siinc al loop hyone mov si,offset buf ;指向数据块首地址 mov cx,count-3 ;将循环次数存入cx中lodsb ;把si指向的存储单元读入累加器hytwo: mov al,si and al,al jz zero ;如果为0的话则跳转到zero jns positive ;如果大于0的话则跳转到positive js negtive;如果小于0的话则跳转到negtivezero: inc bl;统计为0的个
7、数,用bl计数 jmp hythreepositive: inc bh ;统计大于0的个数,用bh计数 jmp hythree negtive: inc dl;统计小于0的个数,用dl计数 jmp hythreehythree: inc si;si加一 loop hytwo ;继续判断下一个数hyfour: dec si;先执行后判断所以si要减1;将0的个数存入数据块之后的第一个单元 mov si,bl inc si;将大于0的个数存入数据块之后的第二个单元 mov si,bh inc si ;将小于0的个数存入数据块之后的第三个单元 mov si,dl mov si,offset buf
8、;指向数据块首地址 mov cx,count ;设置循环次数done: mov al,si ;将数据段的内容赋值给al mov bh,al ;暂存数据 ;右移4位 shr al,1 shr al,1 shr al,1 shr al,1 call disp mov al,bh ;将暂存的数据送回al and al,0fh ;屏蔽掉高四位call disp inc si loop done mov ah,4ch ;终止程序 int 21hdisp proc cmp al,0ah ;与0ah比较,小于0ah,加30h js hyfive ;大于0ah,为十六进制数AF,加37h add al,7 h
9、yfive: add al,30h mov dl,al ;dos功能调用显示字符 mov ah,02 int 21h inc hy cmp hy,02 jz hyseven ret;根据空格显示标志符hy的大小判断是否插入空格hyseven: mov dl,20h ;插入空格 mov ah,2 int 21h inc dh mov hy,0 cmp dh,10h jz hysix rethysix: mov dl,0dh ;回车换行 mov ah,02h int 21h mov dl,0ah mov ah,02h int 21h xor dh,dh ret disp endpcode ends
10、 end start(2)程序流程图图2 3. 十六进制数转换成十进制数 (1) 源程序(附注释):name hexdeccode segmentassume cs:code;提示信息msg1 db erro number,$msg2 db Hello! Please input the hexadecimal number:,$msg3 db Hello! To exit this program,you only have six chances,$msg4 db number overflow,$hy db 0count db 0crlf macro;定义宏指令,回车换行mov dl,0
11、dhmov ah,02hint 21hmov dl,0ahmov ah,2int 21hendmstart: mov ax,seg code mov ds,ax ;给数据段赋值,与代码段在同一个段;提示正确调试的机会只有6次begin: crlf mov dx,offset msg3mov ah,09int 21hcrlfmain: crlf mov dx,offset msg2 ;提示输入一个十六进制的数mov ah,09int 21hcrlf call hexbin ;从键盘接收进制的数并转化为二进制crlfcall bindec;把二进制转化为十进制数crlf mov hy,0 ;重置输
12、入次数标志inc count ;正确调试次数加1cmp count,6 ;如果已经正确调试六次则退出程序jz donejmp maindone: mov ah,4ch ;退出程序 int 21h;接收键盘输入的十六进制数据,并转化为二进制子程序hexbin proc nearxor bx,bxnewchar: mov ah,01int 21hcmp al,0dh ;若输入回车则结束本程序 jz retu;统计输入的十六进制数长度,如果大于ffffh则溢出报错 inc hy cmp hy,5 jz bck ;溢出报错sub al,30hjl exit ;键入的字符小于0,为非法字符cmp al,
13、9jle addto ;键入的字符大于0,小于9,移位处理sub al,07 ;判断是否为字母AFcmp al,0ah ;不是大于A的字母为非法字母jl exit cmp al,0fh ;判断是否为afjg nextaddto: mov cl,4shl bx,cl ;键入的字符左移四位,先键入的字符移向高位mov ah,0 add bx,ax;把刚键入的字符与前面的字符和在一起jmp newchar;溢出报错bck: mov hy,0 xor bx,bx xor ax,ax crlf mov dx,offset msg4 mov ah,09 int 21h crlf jmp mainnext:
14、 sub al,20h ;判断是否为小写af cmp al,0ah jl exit ;小于a为非法字符 cmp al,0fh ;大于f为非法字符 jle addto jg exit jmp returetu: ret;输入的不是16进制数,报错exit: crlf mov dx,offset msg1 mov ah,09 int 21hcrlfjmp newcharhexbin endp;把二进制数转换为十进制数bindec proc nearmov cx,10000 call hyfinal ;键入的数含有几个万位mov cx,1000 call hyfinal;键入的数含有几个千位mov
15、cx,100 call hyfinal;键入的数含有几个百位mov cx,10 call hyfinal;键入的数含有几个十位mov cx,1 call hyfinal;键入的数含有几个个位ret bindec endphyfinal proc nearmov ax,bx ;被除数的低十六位在ax中mov dx,0 ;被除数的高十六位在dx中div cx mov bx,dx ;余数在dx中,送入bxadd al,30hmov dl,al ;显示商al,即转换后的十进制数mov ah,2 int 21hrethyfinal endpcode endsend start (2)程序流程图: 图3四
16、、实验结果1. 显示256个ASCII码(1)编译t1.asm,生成t1.obj和t1.exe,如图:(2)运行t1.exe,输出256个ASCII码,每16个为一行,运行结果如下: 2. 写入数据,统计元素个数(1)编译t2.asm,生成t2.obj和t2.exe,如图所示 (2)运行t2.exe,前256位输出为00hFFh数据,后3位输出为统计正,零,负结果,运行结果如图所示 3. 十六进制数转换成十进制数(1)编译t3.asm,生成t3.obj和t3.exe,如图所示 (2)基础功能:运行t3.exe,首先输出提示信息,提示输入一个十六进制的数,并将输入十六进制转化为十进制,支持af大
17、写和小写输入。提高功能:1,输入超界或格式错误会提示错误。2,而且增加了退出程序的功能,当正确运行六次之后程序将退出,方便调试其他程序。 五、实验总结 本次实验所有代码均为自主调试编写,自主思考,发现问题解决问题,在参考书本代码的基础上完成了所有的实验。通过本次实验,极大的提高了我的汇编能力,让我对书本的知识有了更深层次的了解。并且逐渐掌握了一些汇编的技巧。在一步步的调试纠错中,从最开始的逻辑混乱,众多bug,到最后的全部编译通过,这个过程真的让人成长了许多。 总结一下遇到的主要问题和解决方法: 问题1:在使用条件转移指令时,报错jump out of range by 7 bytes 解决:百度之后发现:8086指令中的条件转移指令,采用的都是短转移,采用8位的相对位移量。也
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 固废破碎与筛分系统的成本控制方案
- 施工现场资源调配与优化方案
- 建筑装饰工程现场环境管理方案
- 公证处考试试题及答案
- 公司电工考试试题及答案
- 触控互动设备部署与管理方案
- 工地临电考试试题及答案
- 智能车间流程集成与自动化控制
- 数字展览展示与交互内容的个性化定制方案
- 智能制造生产线调试与运行管理方案
- 贝克-常伟汽车后视镜电加热薄膜技术
- 建设项目环境影响评价收费标准
- 大学生素质教育主题班会课件
- 四年级劳动教育-学做水果拼盘(课件)
- 1二年级上册小学生经典诵读校本课程教材
- 2021年吉县社区工作者招聘笔试题及答案解析
- 城市轨道交通乘客服务课件(完整版)
- 2022年公务员申论答题标准格子纸Word版A4打印版
- 农产品食品检验员理论知识竞赛题库
- 新高考英语读后续写——故事编写思路
- 中国地质大学(北京)海洋科学导论考研题库
评论
0/150
提交评论