




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、信息与通信工程学院 微机原理软件实验报告2013年微机原理软件实验报告 学 院:信息与通信工程学院班 级:2011211104姓 名: 实验二 分支,循环程序设计一.实验目的: 1.开始独立进行汇编语言程序设计; 2.掌握基本分支,循环程序设计;3.掌握最简单的 dos 功能调用二.实验内容: 1.安排一个数据区,内存有若干个正数,负数和零.每类数的个 数都不超过 9. 2.编写一个程序统计数据区中正数,负数和零的个数.3. 将统计结果在屏幕上显示.三.预习题 1.十进制数 0 - 9 所对应的 ascii 码是什么? 如何将十进制数 0 - 9 在屏幕上显示出来? 0-9的acsii码为,3
2、0h,31h,32h,34h,35h,36h,37h,38h,39h, 将要显示的数加上30h,得到该数的acsii码,再利用dos功能调用显示单个字符 2.如何检验一个数为正,为负或为零? 你能举出多少种不同的方法? 利用cmp指令,利用test指令,将该数与0相与,将该数与0相减,观察标志位。四程序流程图是 开始初始化,将data赋给dssi指向带处理数据,cx存入数据个数判断si是否大于等于0否minus(存小于0个数)加一是判断是否等于0zero(存等于0个数)加一plus(存等于0个数)加一 si加一 cx减一 cx=0? 显示结果返回,结束否 是否五.源程序 data segmen
3、t ;数据段 num db 1,2,-2,3,-3,5,2,4,-6,-11,100,0,0,34,-55,-33,0 ;待处理数据 count equ $-num ;数据个数 minus db 0 ;小于零的个数 zero db 0 ;等于零的个数 plus db 0 ;大于零的个数 result db negnum=,?,0ah,0dh,zeronum=,?,0ah,0dh,posnum=,?,0ah,0dh,$ ;结果显示字符串 data ends stack segment stack stack ;堆栈段 dw 50 dup(?) stack ends code segment ;代
4、码段 assume cs:code,ds:data,ss:stack start: mov ax,data mov ds,ax mov cx,count mov si,offset num again: mov al,si ;循环比较 cmp al,0 jge next1 inc minus jmp done next1: jz next2 inc plus jmp done next2: inc zero done: inc si loop again ;返回结果 mov di,offset result mov al,minus add al,30h mov byte ptrdi+7,al
5、 mov al,zero add al,30h mov byte ptrdi+18,al mov al,plus add al,30h mov byte ptrdi+28,al mov ah,09h mov dx,di int 21h mov ax,4c00h int 21h code ends end start 五.程序运行结果正确输出了正数,负数,零的个数七.实验心得与体会 这次实验练习了用跳转语句实现分支结构,使我更加熟悉了跳转语句在分支结构中的应用,练习了用dos功能调用输出字符串。将课堂的理论应用于实践,体会到了汇编语言编程的特点和魅力。 实验三 代码转换程序设计一.实验目的: 1
6、.掌握几种最基本的代码转换方法; 2.运用子程序进行程序设计.二.实验内容: 1.从键盘上输入若干两位十进制数,寻找其中的最小值,然后在屏幕上显示出来. 2.两个十进制数之间的分隔符,输入结束标志自定,但要在报告中说明. 3.对输入要有检错措施,以防止非法字符输入,并有适当的提示. 4.将整个程序分解为若干模块,分别用子程序实现.在报告中要给出模块层次图.三预习题 1如何将输入的两个字符(0 - 9)变为十进制或二进制数? 将输入的字符减去30h,可得到对应十进制数,将第一个数乘10,加上第二个数,即为最后结果 2如何将选出的最小值(二进制或十进制)变为 ascii 码再进行显示? 说明:输入
7、的字符以空格间隔,以回车结束,且仅允许输入两位十进制数,输入其他字符,或者输入多位,都会报错 将输入的字符串先转化成数串,选出其中的最小值,转化为对应十位和个位,分别加上30h,输出显示 3你觉得采用二进制运算还是十进制运算更适合于这个实验? 十进制四程序流程图 开始初始化,data赋给ds利用0ah号dos功能调用,输入数据将字符串长度存入cx判断字符是否为空格或回车判断是否为09否是判断为十位还是个位,分别存入ah,al是判断空格或回车前输入的书否为两位数调用transfer子程序di加一si加一cx-1cx=0?否否是调用finmin,showmin子程序,显示结果结束显示输入错误 是否
8、五模块层次图 主程序transfer子程序findmin子程序showmin子程序 六.源程序 data segment;数据段 buffer db 100 ;存放带输入的数据 db 0 db 100 dup(0) num db 100 dup(0) ;存放将输入的数据转化为对应的数 min db 100 ;存放最小数 result db 0ah,0dh,minnum=,?,?,0ah,0dh,$;显示结果 errmsg db 0ah,0dh,input error,0ah,0dh,$;显示错误信息 data ends stack segment stack stack;堆栈段 dw 50 d
9、up(?) stack ends code segment ;代码段 assume cs:code,ds:data,ss:stack ;将两位十进制字符转化为对应数的子程序 ;入口参数:ax,ah存放十位的acsii码,al存放个位的acsii ;出口参数:al,存放转化后的数值 transfer proc near pushf push cx sub ah,30h sub al,30h shl ah,1 mov ch,ah mov cl,2 shl ah,cl add ah,ch add al,ah mov ah,0 pop cx popf ret transfer endp ;找最小数的子
10、程序 ;入口参数:di,指向带比较数的最后一个数的下一位 ;出口参数:min,得到最小数 findmin proc near pushf push ax loop1: dec di mov al,numdi cmp al,min jae next mov min,al next: cmp di,0 jz done jmp loop1 done: pop ax popf ret findmin endp ;显示最小数的子程序 showmin proc near pushf push ax push bx mov al,min mov ah,0 mov bl,10 div bl add ah,30
11、h mov result10,ah add al,30h mov result9,al mov ah,09h mov dx,offset result int 21h pop bx pop ax popf ret showmin endp start: mov ax,data ;程序开始 mov ds,ax mov dx,offset buffer mov ah,0ah int 21h mov ax,0 mov bx,0 mov di,0 mov si,1 mov cl,byte ptr buffersi mov ch,0 inc cx inc si again: cmp byte ptr b
12、uffersi,20h ;处理输入的字符串 jz next1 cmp byte ptr buffersi,0dh jz next1 cmp byte ptr buffersi,30h jb errshow cmp byte ptr buffersi,39h ja errshow inc bl cmp bl,2 jz sec mov ah,byte ptr buffersi jmp next2 sec: mov al,byte ptr buffersi jmp next2 next1: cmp bl,0 jz next2 cmp bl,2 jnz errshow mov bl,0 call tr
13、ansfer ;将字符转化为数,并存入num mov numdi,al inc di next2: inc si loop again call findmin call showmin jmp exit errshow:mov dx,offset errmsg mov ah,09h int 21h exit: mov ax,4c00h int 21h code ends end start 七.程序运行结果八.实验心得与体会 这次实验相较实验二增加了很大的难度,在ascii码和数值之间的转化部分,花了我不少的时间来编写,也花了不少时间调试,最后能成功,觉得很有成就感,也觉得自己编程更加熟练了
14、,也了解了几个汇编错误码的含义。 练习了子程序的使用,0ah号dos功能调用等。体会到了汇编语言粒度很难小的特点,所以实现起来比较麻烦,但也不失乐趣。实验四 子程序设计 一.实验目的: 1.进一步掌握子程序设计方法; 2.进一步掌握基本的 dos 功能调用.二.实验内容: 1.从键盘上输入某班学生的某科目成绩.输入按学生的学号由小到大的顺序输入. 2.统计检查每个学生的名次. 3.将统计结果在屏幕上显示. 4.为便于观察,输入学生数目不宜太多,以不超过一屏为宜.输出应便于阅读.尽可 能考虑美观. 5.输入要有检错手段.三.预习题1.如何确定一个学生在这门科目中的名次?对学生的成绩进行排序,并记
15、录对应的学号,最后得到由低到高的成绩序列及对应的学号,即得到学生的排名2.你觉得输入结束后,采用什么方法进行比较以得到学生的名次最为简单? 我认为应该采用选择排序,每次选出最高的分数,并记录学号,输出学号和分数。而后,将该同学的分数置0,再重复以上操作,直到输出所有学生的学号和成绩四程序流程图 开始初始化,data赋给ds利用0ah号dos功能调用,输入成绩将字符串长度存入cx判断字符是否为空格或回车判断是否为09否是判断为百位,十位,个位分别存入bh,ah,al是判断空格或回车前输入的书3位以内的数调用transfer子程序di加一si加一cx-1cx=0?否否是调用sort子程序showr
16、esult子程序,显示结果结束显示输入错误 是 五模块层次: 主程序transfer子程序sort子程序showresult子程序shownum子程序transnum子程序六源程序 data segment ;数据段 buffer db 200 ;存放输入的成绩 db 0 db 200 dup(0) num db 200 dup(0) ;存放输入字符转化后的成绩数值 max db 0 ;存放排序每次最高的成绩 maxnum dw -1 ;存放每次最高成绩的学生的学号 result db 0ah,0dh, r n g,0ah,0dh, ;显示结果 db 200 dup(10 dup(0),0ah
17、,0dh) errmsg db 0ah,0dh,input error,0ah,0dh,$;错误信息 data ends stack segment stack stack ;堆栈段 dw 50 dup(?) stack ends code segment ;代码段 assume cs:code,ds:data,ss:stack ;将字符转化为对应数值的子程序 ;入口参数:bh,ax,分别存放百,十,个位 ;出口参数:al,转化后的分数值 transfer proc near pushf push cx sub bh,30h cmp bh,0 jnz good sub ah,30h sub a
18、l,30h shl ah,1 mov ch,ah mov cl,2 shl ah,cl add ah,ch add al,ah jmp exit1 good: mov al,100 exit1: mov ah,0 pop cx popf ret transfer endp ;选择排序子程序 ;入口参数:di,指向带排序数组的最后一个数的下一位 ;出口参数:显示成绩单 sort proc near pushf push ax push bx push cx push dx mov dx,0 mov si,13 mov cx,di mov bx,di loop2: mov di,bx loop1:
19、 dec di mov al,byte ptr numdi cmp al,max jbe next mov max,al mov maxnum,di inc maxnum next: cmp di,0 jz done jmp loop1 done: mov di,maxnum mov byte ptr numdi-1,0 inc dx call shownum mov max,0 mov maxnum,-1 loop loop2 exit2: pop dx pop cx pop bx pop ax popf ret sort endp ;将数值转化为对应的ascii码,存入result待显示
20、transnum proc near pushf push bx mov bl,10 div bl add al,30h mov byte ptr resultsi, inc si mov resultsi,al inc si add ah,30h mov resultsi,ah inc si pop bx popf ret transnum endp ;显示排名,学号,成绩 ;入口参数:dx,di,max,分别表示排名、成绩和学号 ;出口参数:result,显示结果 shownum proc near pushf push ax mov ax,dx call transnum mov ax,
21、di call transnum cmp max,100 jz great mov byte ptr resultsi, inc si mov al,max mov ah,0 call transnum jmp exit3 great: mov byte ptr resultsi,31h inc si mov byte ptr resultsi,30h inc si mov byte ptr resultsi,30h inc si exit3: add si,2 pop ax popf ret shownum endp ;将结果result显示出来 showresult proc near p
22、ushf push ax push dx mov byte ptr resultsi,0ah inc si mov byte ptr resultsi,0dh inc si mov byte ptr resultsi,$ mov dx,offset result mov ah,09h int 21h pop dx pop ax popf ret showresult endp start: mov ax,data mov ds,ax mov dx,offset buffer mov ah,0ah int 21h mov ax,3030h mov bx,3000h mov di,0 mov si
23、,1 mov cl,byte ptr buffersi mov ch,0 inc cx inc si again: cmp byte ptr buffersi,20h jz next1 cmp byte ptr buffersi,0dh jz next1 cmp byte ptr buffersi,30h jb errshow cmp byte ptr buffersi,39h ja errshow inc bl cmp bl,3 jz third cmp bl,2 jz sec mov al,byte ptr buffersi jmp next2 third: mov bh,ah mov a
24、h,al mov al,byte ptr buffersi jmp next2 sec: mov ah,al mov al,byte ptr buffersi jmp next2 next1: cmp bl,0 jz next2 cmp bl,3 ja errshow call transfer mov numdi,al mov bx,3000h mov ax,3030h inc di next2: inc si loop again call sort call showresult jmp exit errshow:mov dx,offset errmsg mov ah,09h int 2
25、1h exit: mov ax,4c00h int 21h code ends end start 七程序运行结果 八.实验心得与体会 这次实验和实验三比较类似,但又比实验三难了不少,主要是因为增加了排序的部分,在对成绩排序的同时还要保存相应的学号,增加了代码的复杂度。 但经过努力的思考和尝试,最终我还是完成了这个程序,也使得我对子程序的应用更加熟练,进一步提高了我的编程能力。 实验五 中断程序设计一.实验目的: 1.初步掌握中断程序的设计方法: 2.初步掌握修改 dos 系统中断,以适应实际使用的方法.二.实验内容: 1.编写一个 32 位二进制数除以 16 位二进制数的除法程序.观察当除数
26、为 0,或 超过相应寄存器范围时,程序执行的结果. 2.修改零号中断服务程序,使它具有以下功能: (1)判断除数是否为 0,当除数为 0 时,显示相应的结果; (2)当除数不为 0 时,采用适当的方法完成商超过 16 位的二进制数的除法运算. 3.注意必须保护原有中断服务程序的入口地址,并在程序完毕前加以恢复.三.预习题1. 如何保护原有中断向量表中的中断服务程序的入口地址?先读取中断向量表中0号中断的地址,压入堆栈,程序结束时弹出堆栈,写回中断向量表即可。2. 如何将你的中断服务程序入口地址置入中断向量表?有两种基本方法:一是直接写入法,使用指令将中断服务程序入口地址的ip写入n4的ram位
27、置,中断服务程序入口的cs写入n4+2的位置;二是dos功能调用,25h用来写中断向量表,35h读中断向量表。 开始获取原始的0号中断程序地址,压入堆栈保护将新编写的0号中断程序地址存入0000h:0000h进行32位除16位的除法,商溢出,进入0号中断判断除数是否为0是除数乘8,后进行除法,最后商进行移位乘8操作,移出的高位在result2中否输出错误信息divide 0中断返回,回复原始中断服务程序地址 结束四程序流程图五源程序 data segment num1 dd 65536 num2 dw 1 result2 dw 0 result dw 0 remain dw 0 showreu
28、 db 0ah,0dh,32 dup(0),0ah,0dh,$ showrem db 0ah,0dh,16 dup(0),0ah,0dh,$ errmsg db 0ah,0dh,divide 0,0ah,0dh,$ data ends stack segment stack stack dw 50 dup(?) stack ends code segment assume cs:code,ds:data,ss:stack ;进行二进制结果显示的函数 shownum proc far pushf clc mov cx,16 mov ax,result2 mov si,2 loop1:shl ax
29、,1 jc one1 mov byte ptr showreusi,0 jmp next1 one1: mov byte ptr showreusi,1 next1: inc si loop loop1 mov cx,16 mov ax,result loop2:shl ax,1 jc one2 mov byte ptr showreusi,0 jmp next2 one2: mov byte ptr showreusi,1 next2: inc si loop loop2 mov ax,data mov ds,ax mov dx,offset showreu mov ah,09h int 21h mov cx,16 mov ax,remain mov si,2 loop3:shl ax,1 jc one3 mov byte ptr showremsi,0 jmp next3 one3: mov byte pt
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 笔的制造生产过程优化与仿真技术考核试卷
- 纸板容器工厂环境噪声治理考核试卷
- 石棉水泥制品的国内外质量标准对比考核试卷
- 外科个案护理专题分析
- 新生儿高胆红素血症业务查房
- 脑瘫患者麻醉管理规范
- Heneicomycin-生命科学试剂-MCE
- 湖北省2025年中考第三次模拟考试道德与法治试卷(解析版)
- 房地产行业深度报告-“好房子”系列专题一:四代宅崛起政策红利与产品创新驱动居住升级
- 2025年下半年食品饮料行业寒来暑往结构破局
- 2024年云南红河州开发投资控股集团有限公司招聘笔试参考题库含答案解析
- 社区组织心理健康知识讲座
- 化工企业安全管理评估手册 依据化工过程安全管理导则AQ3034-2022
- 设备预防性维护保养计划及实施记录表
- 2024年春江苏开放大学机械CADCAM第一次线下过程性考核操作作业答案
- 无损检测PTⅡ级渗透检测理论考试题库
- 档案管理软件简介介绍
- 2024年山东威海文旅发展集团有限公司招聘笔试参考题库含答案解析
- 坚持以人民为中心
- DB32/T 4700-2024 蓄热式焚烧炉系统安全技术要求
- 《安全仪表系统SIS》课件
评论
0/150
提交评论