微型计算机原理及应用.docx
《微型计算机原理及应用.docx》由会员分享,可在线阅读,更多相关《微型计算机原理及应用.docx(15页珍藏版)》请在冰点文库上搜索。
![微型计算机原理及应用.docx](https://file1.bingdoc.com/fileroot1/2023-7/21/968eddb2-1e69-4510-b135-d45ae7634acc/968eddb2-1e69-4510-b135-d45ae7634acc1.gif)
微型计算机原理及应用
《微型计算机原理及应用》作业
作业组别:
28
班级:
13级工设
(1)班
姓名:
王志辉
学号:
130********2
项目指导教师:
(任课教师、实验室教师)
李艳文
项目完成时间:
2016.4
目录
一.30题3
1.1题目的分析描述及要求3
1.2寄存器及主存等的应用说明3
1.3程序框图4
1.4详细程序5
1.5程序调试5
二.41题6
2.1题目的分析描述及要求6
2.2寄存器及主存等的应用说明6
2.3程序框图6
2.4详细程序7
2.5程序调试8
三.97题9
3.1分析描述及要求9
3.2寄存器及主存等的应用说明9
3.3程序框图9
3.4详细程序10
3.5程序调试11
一.30题
1.1题目的分析描述及要求
编写程序完成统计数据段从source开始单元存放的100个单字节带符号数中负数和正数的个数,将结果分别放于DX和BX中。
算法构造:
首先从source处开始定义100个数,正数、负数和零的个数随意定,然后从中一个一个取出数与0比较,是正数,则bx加1,是负数,则dx加1。
1.2寄存器及主存等的应用说明
内存:
source处存放待检测的字符
寄存器:
AX常作为累加器,使用频率最高,用于算术运算、逻辑运算以及与外
设传送信息等。
BX常作为基址寄存器,用来存放存储器地址。
CX常作计数器,作为循环和串操作等指令中的隐含计数器。
DX常作为数据寄存器,常用来存放双字长数据的高16位或存放外设端口地址。
SI是源地址寄存器。
1.3程序框图
NY
1.4详细程序
sksegmentstack;定义作为堆栈段的逻辑段,段名:
sm
db1024dup(0);分配堆栈的大小,设置为1024字节
skends;堆栈段结束
datasegment;定义作为数据段的逻辑段,段名data
orgsource;定义数据,从source处安排数据
bufdb40dup
(1)
db20dup(0)
db40dup(-1);定义100个数,正数、负数和零的个数随意定
dataends;数据段结束
codesegment'code';定义作为代码段的逻辑段,段名code
assumecs:
code,ds:
data,ss:
sk;确定各个逻辑段的类型
start:
movax,data;程序开始点
movds,ax
movcx,100;令cx寄存器为100
andbx,0
anddx,0;初始化bx,dx,使其为0
leasi,buf将100个数的有效地址给si
count:
cmpbyteptr[si],0
jgpositive
jlnegtive
jmplast
positive:
incbx
jmplast;将si指针所指的数和0比较,若大于0,则bx加
negtive:
incdx1,若小与0,则dx加1
last:
incsi;没比较一次,处理之后si指针加1,将下一个数和
loopcount0比较,直到100个数都比较完
movax,4c00h
int21h;程序结束点,返回DOS
codeends
endstart;汇编结束,程序开始点为start
1.5程序调试
调试结果如下图所示:
程序运行结果基本达到了预期,但在调试过程中仍出现了一些小错误,需要避免。
二.41题
2.1题目的分析描述及要求
若在存储器中有两个数a和b(它们所在地址用符号表示,下同),编一程序实现a×10+b(a×10以及“和”用两字节表示)。
2.2寄存器及主存等的应用说明
寄存器:
AX常作为累加器,使用频率最高,用于算术运算、逻辑运算以及与外
设传送信息等。
BX常作为基址寄存器,用来存放存储器地址。
2.3程序框图
YN
2.4详细程序
sksegmentstack;定义作为堆栈段的逻辑段,段名:
sm
db1024dup(0);分配堆栈的大小,设置为1024字节
skends;堆栈段结束
datasegment;定义作为数据段的逻辑段,段名data
adb120;定义a=120
bdb9;定义b=9
resultdw?
;定义result,暂不设初值
dataends;数据段结束
codesegment'code';定义作为代码段的逻辑段,段名code
assumecs:
code,ds:
data,ss:
sk;确定各个逻辑段的类型
start:
movax,data;程序开始点
movds,ax
moval,a;AL←120
movah,0;AH←0
shlax,1;AX←AX*2(AX←240)
movbx,ax;BX←AX(BX←240)
movcl,2;CL←2
shlax,cl;AX←AX*4,此时AX为960
addax,bx;将AX和BX的和放入AX中,此时AX中的数即a*2=1200
movbl,b;令BL←9
movbh,0;令BH←0
addax,bx;将AX和BX的和放入AX中,即实现了a*10+b的要求
movresult,ax;将最后的结果放入result中
movax,4c00h;程序结束点,返回DOS
int21h
codeends
endstart;汇编结束,程序开始点为start
2.5程序调试
调试结果如下图所示:
结果调试正确,能够正确的实现a*10+b,并且运行结果正确,没有需要改进的地方。
三.97题
3.1分析描述及要求
编写子程序。
将一个字符串中的小写字母转换成大写字母。
该字符串的首地址存放于BX中,字符个数存放于CX中。
主程序调用子程序实现上述功能。
算法构造:
定义一个字符串,然后将其首地址放于bx中,字符个数存放于CX中,然后按顺序取出字符串中的字符和a和z的ASCⅡ码进行比较,若在字符在a和z之间,就将其ASCⅡ码减去20,将其转换为大写字母,否则不作处理。
3.2寄存器及主存等的应用说明
内存:
count处存放字符数量
寄存器:
AX常作为累加器,使用频率最高,用于算术运算、逻辑运算以及与外设传送信息等。
BX常作为基址寄存器,用来存放存储器地址。
CX常作计数器,作为循环和串操作等指令中的隐含计数器。
DX常作为数据寄存器,常用来存放双字长数据的高16位或存放外设端口地址。
3.3程序框图
3.4详细程序
sksegmentstack;定义作为堆栈段的逻辑段,段名:
sm
db1024dup(0);分配堆栈的大小,设置为1024字节
skends;堆栈段结束
datasegment;定义作为数据段的逻辑段,段名data
stringdb"believeyourself!
","$";定义字符串“believeyourself!
”
countdw17;令count=17
dataends;数据段结束
codesegment'code';定义作为代码段的逻辑段,段名code
assumecs:
code,ds:
data,ss:
sk;确定各个逻辑段的类型
start:
movax,data;程序开始点
movds,ax
callprogram;调用名为program的子程序
movdx,offsetstring;dx指向string所在的数据源缓冲区的开始
movah,09h
int21h;调用9号DOS功能输出字符串
movax,4c00h;程序结束点,返回DOS
int21h
Programproc;Program子程序
movbx,offsetstring;bx指向string所在的数据区的开始
movcx,count;cx←count
pushbx
pushcx;将bx、cx压入堆栈保护起来
compare:
cmpbyteptr[bx],61h
jblast
cmpbyteptr[bx],7ah
jalast
subbyteptr[bx],20h;按顺序取出字符串中的字符和a和z的ASCⅡ码进行比较,若在字符在a和z之间,就将其ASCⅡ码减去20,将其转换为大写字母,否则不作处理
last:
incbx
loopcompare
popcx
popbx
ret
programendp;子程序结束,返回主程序
codeends
endstart;汇编结束,程序开始点为start
3.5程序调试
调试结果如下图所示:
程序运行基本正确,但编码过程有些繁琐,编的过程中出现了许多错误,好在经过一遍又一遍的尝试,最终成功实现了运行。