北邮 微机原理 第一次软件实验报告.docx

上传人:b****3 文档编号:4679389 上传时间:2023-05-07 格式:DOCX 页数:23 大小:463.17KB
下载 相关 举报
北邮 微机原理 第一次软件实验报告.docx_第1页
第1页 / 共23页
北邮 微机原理 第一次软件实验报告.docx_第2页
第2页 / 共23页
北邮 微机原理 第一次软件实验报告.docx_第3页
第3页 / 共23页
北邮 微机原理 第一次软件实验报告.docx_第4页
第4页 / 共23页
北邮 微机原理 第一次软件实验报告.docx_第5页
第5页 / 共23页
北邮 微机原理 第一次软件实验报告.docx_第6页
第6页 / 共23页
北邮 微机原理 第一次软件实验报告.docx_第7页
第7页 / 共23页
北邮 微机原理 第一次软件实验报告.docx_第8页
第8页 / 共23页
北邮 微机原理 第一次软件实验报告.docx_第9页
第9页 / 共23页
北邮 微机原理 第一次软件实验报告.docx_第10页
第10页 / 共23页
北邮 微机原理 第一次软件实验报告.docx_第11页
第11页 / 共23页
北邮 微机原理 第一次软件实验报告.docx_第12页
第12页 / 共23页
北邮 微机原理 第一次软件实验报告.docx_第13页
第13页 / 共23页
北邮 微机原理 第一次软件实验报告.docx_第14页
第14页 / 共23页
北邮 微机原理 第一次软件实验报告.docx_第15页
第15页 / 共23页
北邮 微机原理 第一次软件实验报告.docx_第16页
第16页 / 共23页
北邮 微机原理 第一次软件实验报告.docx_第17页
第17页 / 共23页
北邮 微机原理 第一次软件实验报告.docx_第18页
第18页 / 共23页
北邮 微机原理 第一次软件实验报告.docx_第19页
第19页 / 共23页
北邮 微机原理 第一次软件实验报告.docx_第20页
第20页 / 共23页
亲,该文档总共23页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

北邮 微机原理 第一次软件实验报告.docx

《北邮 微机原理 第一次软件实验报告.docx》由会员分享,可在线阅读,更多相关《北邮 微机原理 第一次软件实验报告.docx(23页珍藏版)》请在冰点文库上搜索。

北邮 微机原理 第一次软件实验报告.docx

北邮微机原理第一次软件实验报告

微机原理与接口技术

汇编语言及其程序设计报告

 

姓名

学院信息与通信工程学院

专业

班级

学号

班内序号

 

目录

题目一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,显示出错提示。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工作范文 > 行政公文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2