北邮 微机原理 第一次软件实验报告.docx
《北邮 微机原理 第一次软件实验报告.docx》由会员分享,可在线阅读,更多相关《北邮 微机原理 第一次软件实验报告.docx(23页珍藏版)》请在冰豆网上搜索。
北邮微机原理第一次软件实验报告
微机原理与接口技术
汇编语言及其程序设计报告
姓名
学院信息与通信工程学院
专业
班级
学号
班内序号
目录
题目一3
一、实验目的3
二、实验任务及内容3
1设计思路3
2流程图3
3源代码4
4子程序清单4
三、实验结果5
题目二6
一、实验目的6
二、实验任务及内容6
1设计思路6
2流程图6
3源代码8
4子程序清单10
三、实验结果10
题目三11
一、实验目的11
二、实验任务及内容11
1设计思路11
2流程图12
3源代码13
4子程序清单16
三、实验结果16
题目一
一、实验目的
编写一程序,在显示器上显示256个ASCII码,要求显示格式为每行显示16个字符,两个ASCII字符间空一格。
二、实验任务及内容
1.
2.
1设计思路
设DH寄存器初值为0。
使用CX寄存器进行256次循环,循环中把DH赋值给DL,利用AH=02H的DOS功能调用INT21H,把DL中的字符和空格输出到屏幕上。
进入下一循环前,调用子程序,将DX入栈,判断已输出个数是否为16的倍数,若是,输出回车换行到屏幕上之后,再进行下一循环过程;如果不是16的倍数,DX直接出栈。
2流程图
图1.1流程图
3源代码
DATASEGMENT
DATAENDS
STACKSEGMENTSTACK
DB100HDUP(?
);共256个数
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX
;MOVAX,STACK
;MOVSS,AX
MOVAH,02H
MOVDH,0
MOVCX,256;循环次数256次
NEXT:
MOVDL,DH
INT21H
MOVDL,20H;两数据间加一空格
INT21H
CALLDISP;调用子程序
INCDH;DH加1,对应下一个ASCII码
LOOPNEXT;循环至CX为0
STOP:
MOVAH,4CH;结束
INT21H
DISPPROC;子程序,判断是否换行
PUSHDX
ANDDH,0FH;是否是16的倍数,若是16的倍数,DH为0FH
CMPDH,0FH;与0FH比较
JNZRETURN;DH不为0FH
MOVDL,13;回车,换行
INT21H
MOVDL,10
INT21H
RETURN:
POPDX;不是16的倍数
RET
DISPENDP
CODEENDS
ENDSTART
4子程序清单
子程序名:
DISP
功能:
使每行显示16个字符
所用寄存器:
DX,FR
入口参数:
DX中的已循环次数
出口参数:
DX中的已循环次数
三、实验结果
图1.2编译和连接
图1.3运行结果
题目二
一、实验目的
教材P170第1、2、3题合到一起编一完整的程序。
1)编写一程序,把地址偏移量为100H单元开始的256个单元分别写入00H,01H,02H,03H,...,FFH数据;
2)统计写入的数据块中0元素、正元素、负元素的个数,并分别把统计结果送入上述数据块之后的三个单元中;
3)用DOS功能调用显示第1题中数据块各单元(包括统计结果)内容。
二、实验任务及内容
3.
4.
1设计思路
程序分为三个部分:
第一个部分,SI存放数据块的偏移量,CX存入循环次数256次,将AL清零。
使内存单元地址每增加一,AL也加一,使得存入的数是递增的;
第二个部分,将BX和DH清零,BL存放正元素个数,BH存放负元素个数,DH存放0元素个数。
循环256次,且每次循环都对当前内存单元中的数据进行判定,并将其对应的类型个数加一,最后将结果存入数据块
第三个部分,CX赋值为259,作为第一个循环,在每次循环中,把内存单元的数据转换成ASCII码并格式化输出,并且若CX不为0,进入第二个循环,否则结束;BH赋值为16,作为第二个循环,使16个数为一行,然后回车换行。
2流程图
图2.1主程序流程图
图2.2第一部分流程图
图2.3第二部分流程图
图2.4第三部分流程图
3源代码
DATASEGMENT
ORG100H;数据块在段中的偏移地址
BUF1DB259DUP(?
);256个单元存放数据,3个单元存放结果
COUNTEQU$-BUF1;数据块长度
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVSI,OFFSETBUF1
MOVCX,COUNT-3;循环总次数256次
XORAL,AL;AL清零
NEXT1:
MOV[SI],AL
INCAL;AL从00开始递增
INCSI
LOOPNEXT1;完成第一步,写入00H,01H...FFH数据
MOVSI,OFFSETBUF1
MOVCX,COUNT-3
XORBX,BX;BL存放正元素个数,BH存放负元素个数
XORDH,DH;DH存放0元素个数
NEXT2:
MOVAL,[SI]
CMPAL,0
JZZERO;为0,转到zero
JSNEGAT;为负数,转到negat
JMPPLUS;不为零不为负,即为整数,转到plus
ZERO:
INCDH;0个数加1
JMPNEXT3
NEGAT:
INCBH;负元素个数加1
JMPNEXT3
PLUS:
INCBL;正元素个数加1
NEXT3:
INCSI
LOOPNEXT2;循环直到统计完256个数
MOV[SI],DH;存放统计结果
INCSI
MOV[SI],BX;完成第二步,统计零、正、负元素个数并存放结果
MOVSI,OFFSETBUF1
MOVCX,COUNT
ZRBH:
MOVBH,16;每行显示16个数
NEXT4:
MOVAL,[SI]
MOVBL,AL;取出要显示的数,放在BL中
SHRAL,1;右移四位,先处理高四位
SHRAL,1
SHRAL,1
SHRAL,1
CMPAL,0AH;判断是字母还是数字
JCJIA30;是数字,转到JIA30
ADDAL,7;是字母
JIA30:
ADDAL,30H;数字加30H,字母加37H转换为ASCII码
CALLDISP;调用显示子程序
MOVAL,BL;开始处理低四位
ANDAL,0FH;高四位置零
CMPAL,0AH;处理方法类似
JCJIA30A
ADDAL,7
JIA30A:
ADDAL,30H
CALLDISP
MOVAL,20H;显示一空格
CALLDISP
INCSI
LOOPNEXT5
JMPSTOP;CX为0时,即显示完259个数之后,结束
NEXT5:
DECBH
JNZNEXT4;继续显示直到每行有16个数
MOVAL,0AH;回车,换行
CALLDISP
MOVAL,0DH
CALLDISP
JMPZRBH;继续处理下一行
STOP:
MOVAH,4CH
INT21H
DISPPROCNEAR;子程序,显示字符
MOVDL,AL
MOVAH,2
INT21H
RET
DISPENDP
CODEENDS
ENDSTART
4子程序清单
子程序名:
DISP
功能:
使每行显示16个字符
所用寄存器:
AL,DL,AH
入口参数:
AL存放要显示的字符
出口参数:
无
三、实验结果
图2.5编译和连接
图2.6运行结果
每行显示16个数,先显示00H,01H……FEH,FFH,再显示零元素个数01H,正元素个数7FH,负元素个数80H。
题目三
一、实验目的
教材P173第21题:
编一程序,把键入的十六进制数转换成十进制数并在屏幕上显示出来。
键入的最大数为FFFFH,若键入的不是十六进制数字,则显示出错提示。
1)在屏幕上显示转换的十进制数,键入的最大数为FFFFH;
2)若键入非十六进制数,则显示出错提示;
3)程序中至少用到一个子程序和一个宏指令,若键入CTRL+C则返回系统。
二、实验任务及内容
5.
6.
1设计思路
主程序中,先定义回车、换行的宏指令,再调用两个子程序,第一个子程序是输入十六进制数并判断是否溢出FFFFH,然后将输入的合理的十六进制数转换成二进制数;第二个子程序是将转换好的二进制数转换成十进制数并输出显示。
第一个子程序首先判断键入的字符是否为合法十六进制字符,若合法,存入BX中,接着接收下一个新的字符,同时将上个字符左移4位,与刚键入的字符相加,存入BX中;若非法,则显示错误信息,返回开始处重新输入。
若键入回车符,则本次键入的字符结束,进入转换程序。
第二个程序它把二进制转换成十进制数。
调用除法子程序,把BX中的若干位十六进制数除以CX中的数,每次所得的商即是要转换成的十进制数,将其转换为ASCII码在屏幕上显示出来,并将余数存入BX返回。
CX分别赋以10000,1000,100,10,1。
2流程图
图3.1主程序流程图
图3.2子程序HEXBIN流程图
图3.3子程序BINDEC流程图
图3.4子程序DEC-DIV流程图
3源代码
NAMEHEXDEC
CODESEGMENT
ASSUMECS:
CODE
MSGDB'ErrorNumber!
','$'
ERROFDB'OVERFLOAT!
(0~FFFFH)','$'
CRLFMACRO;定义宏指令,回车换行
MOVDL,0DH;送回车符
MOVAH,2;DOS调用,显示
INT21H
MOVDL,0AH;送换行符
MOVAH,2
INT21H
ENDM
START:
MOVAX,SEGCODE
MOVDS,AX;给数据段赋值,与代码段同在一个段
MAIN:
CALLHEXBIN;从键盘接受十六进制数据,并转换为二进制
CRLF;回车换行宏指令
CALLBINDEC;把二进制数转换为十进制数
CRLF;调用宏指令,回车换行
JMPMAIN;继续键入字符与转换
;接收键盘键入的十六进制数据,并转换为二进制数子程序
HEXBINPROCNEAR
XORBX,BX;BX清零,存放键入的十六进制数
MOVBP,0;;键入的字符数
NEWCHAR:
MOVAH,01;DOS调用,接收键入的字符
INT21H
CMPAL,0DH;若键入回车,则结束本组键入的数据
JZRETU
SUBAL,30H
JLEXIT;键入的字符小于0,为非法字符
CMPAL,9
JLEADDTO;键入的字符0-9转到移位处理
SUBAL,07H;键入的字符大于9,判断是否为字母A-F
CMPAL,0AH
JLEXIT;不是大于A的字母,为非法字符
CMPAL,0FH;若大于字母F,再判断是否为小写字母
JGNEXT
ADDTO:
MOVCL,4
SHLBX,CL;键入的字符左移4位,先键入的字符移向高位
INCBP
CMPBP,5;键入字符数不能超过四个
JZOVERFLOAT;报错
MOVAH,0
ADDBX,AX;把刚键入的字符与前面的字符合在一起
JMPNEWCHAR;再接收新的字符
NEXT:
SUBAL,20H;判断是否为小写字母a-f
CMPAL,0AH
JLEXIT;若小于a,则为非法字符
CMPAL,0FH
JLEADDTO
JGEXIT
JMPRETU
OVERFLOAT:
CRLF
MOVDX,OFFSETERROF
MOVAH,09
INT21H
EXIT:
CRLF;调用回车换行宏指令
MOVDX,OFFSETMSG;显示非法字符信息
XORBX,BX
MOVAH,09
INT21H
CRLF
JMPNEWCHAR
RETU:
RET
HEXBINENDP
;把二进制数转换为十进制数子程序
BINDECPROCNEAR
MOVCX,10000;因键入的数最大为FFFFH=65535
CALLDEC_DIV
MOVCX,1000;键入数的千位
CALLDEC_DIV
MOVCX,100;键入数的百位
CALLDEC_DIV
MOVCX,10;键入数的十位
CALLDEC_DIV
MOVCX,1;键入数的个位
CALLDEC_DIV
CRLF
RET
BINDECENDP
DEC_DIVPROCNEAR
MOVAX,BX;被除数的低16位在AX中
MOVDX,0;被除数的高16位在DX中
DIVCX;32位除以16位
MOVBX,DX;余数在DX中,送入BX
ADDAL,30H;商在AL中,转换为ASCII码
MOVDL,AL
MOVAH,2
INT21H
RET
DEC_DIVENDP
CODEENDS
ENDSTART
4子程序清单
1)子程序名:
HEXBIN
功能:
接收键盘键入的十六进制数据,并转换为二进制数
所用寄存器:
BX,AH,AL,CL,DX,FR
入口参数:
无
出口参数:
转换后的二进制数,存放在BX中
2)子程序名:
BINDEC
功能:
把二进制数转换为十进制数
所用寄存器:
CX,BX,AX,DX
入口参数:
BX中的转换后的二进制数
出口参数:
无
调用的其他子程序:
DEC-DIV
3)子程序名:
DEC-DIV
功能:
作除法,得到商和余数。
所得商即为键入的数含有的万位、千位、百位、十位或个位,显示商,返回余数。
所用寄存器:
AX,BX,DX,CX
入口参数:
BX中的二进制数
出口参数:
作除法后得到的余数,存入BX
三、实验结果
图3.5编译和连接
图3.6运行结果
执行程序的过程如下:
首先输入回车键,得到转换结果为00000;
输入100,得到转换结果为00256;
输入AAAAA,超过了可转换的最大值,显示出错提示;
输入FFFF,得到转换结果为65535;
输入非十六进制数K,显示出错提示。