《微型计算机原理及应用》作业Word文档下载推荐.docx
《《微型计算机原理及应用》作业Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《《微型计算机原理及应用》作业Word文档下载推荐.docx(12页珍藏版)》请在冰豆网上搜索。
3.3详细程序9
3.4程序调试情况12
四.体会和建议12
一.题24.1问题描述
内存source处存放着20个ASCII码字符,从键盘输入一个字符,若输入的是为‘a’-‘z’之间的字符(例如g),则将source处的20个ASCII码字符传送至result处,传送时要求将‘a’-‘z’之间的字符转换成大写字符,而其他字符不变,并统计与输入字符(‘g’)相同的字符的个数,存入变量num中,程序结束;
若输入的是其他字符,则在下一行显示‘ERROR!
’,程序结束。
1.1寄存器及主存的应用说明
内存:
source处存放待检测的字符
count处存放字符数量
result处存放修改过的新的字符
num处存放与输入字符相同的字符的个数
error处存放回车换行及字符串ERROR!
寄存器:
bx用于使result指向的地址每次加1以存放下一个字符
al用于存放输入的字符
si用于存放地址
dl用于存放si指向的字符
cx用于计数
1.2程序框图(见第四页)
1.3详细程序
.modelsmall
.stack
.data
sourcedb'
abcdgggg456789AB+-*/'
countequ$-source
resultdbcountdup(?
)
numdb0
errordb0dh,0ah,'
ERROR!
$'
.code
.startup
xorbx,bx;
bx清零
movah,1;
输入一个字符
int21h
cmpal,'
a'
;
输入的字符与a比较,如果比a
jbdone;
小或比z大则跳转至done
z'
jadone
leasi,source;
把首地址赋值给si
movcx,count;
cx赋值循环次数
again:
movdl,[si];
si指向的字符赋值给dl
cmpdl,'
若此字符比a小或比z大,则跳
jbone;
转至one
jaone
cmpdl,al;
若此字符在a-z之间,则与输入
jnztwo;
的字符比较,不相等则跳至two
addnum,1;
若相等则num加1
two:
subdl,20h;
将小写字符转换成大写字符
one:
movresult[bx],dl;
将此字符存入result处
incbx;
地址加1以存放下一个字符
incsi;
指向下一个待检测字符
loopagain;
循环
jmpthree;
跳转至three
done:
movdl,0dh;
回车,换行,显示ERROR!
movah,2
int21h
movdl,0ah
movdx,offseterror
movah,9
three:
;
结束
.exit
end
1.4程序调试情况
第一次错误:
语句one编写如下,
movresult,dl
incresult
incsi
loopagain
原以为incresult会使地址加1,结果是result存储的值加1,导致第一个数加了20而其他数值没变,运行结果如图:
其中source和result有20个字符,由于图片清晰度问题,所以没有全部截图出来
第二次错误:
刚开始给cx赋值为20,而实际应该赋值count,如果source存入21个字符,运行结果将只有20个字符。
正确的运行结果如下图:
二.题24.2问题描述
内存中source处存放着一个以0为结束标志的ASCII码字符串,该字符串表示的是一个字型有符号整数。
请将其转换为对应的有符号整数,存放到自变量result处。
转换过程中,若遇到‘0’-‘9’及‘+’,‘-’以为的字符,或者转换结果超过了字型有符号数的范围(-32768-+32767),则显示‘ERROR!
2.1寄存器及主存的应用说明
内存
source处存放待检测字符
result处存放转换后的字型
error处存放字符串
bx存放取出的数值
cx存放标志数值
si存放地址
2.2程序框图(见第八页)
2.3详细程序
-12345'
0
resultdw?
errordb'
.startup
首地址赋值给si
bx,dx分别清零
xordx,dx
cmpbyteptr[si],0;
第一个字符是0,则跳转至done
jzdone
cmpbyteptr[si],'
-'
;
若不是0则与‘-’比较
movcx,-1;
cx赋值-1作为标志
jzone;
跳转至one
+'
与‘+’比较
movcx,0;
cx赋值0作为标志
cmpbyteptr[si],31h;
若既不是‘-’也不是‘+’则
jbfour;
与1比较,比1小,跳至four
cmpbyteptr[si],39h;
若比1大,则与9比较,比9
jafour;
大,则跳转至four
decsi;
第一个字符为数字,则si减1
incsi;
si加1指向下一个字符
与0比较,相等则结束
jztwo
shlbx,1;
以下5句将bx通过移位乘10
movdx,bx;
但第一次bx为0
shlbx,1
addbx,dx
movax,[si];
si指向的数赋值给ax
xorah,ah;
只保留低位
subax,30h;
ASCII码减30取出第一个数
addbx,ax;
赋值给bx
jmpone
cmpcx,-1;
cx与-1比较
jnzfive;
不相等跳转至five
cmpbx,32768;
cx=-1,则bx与32768比较
比32768大则跳转至four
jmpnega;
否则跳转至nega
five:
cmpbx,32767;
cx=0,则bx与32767比较
大于32767则跳转至four
否则跳转至three
nega:
notbx;
bx取反
addbx,1;
b加1
movresult,bx;
bx赋值给result
jmpdone;
跳转至done
four:
movdx,offseterror;
显示错误
movah,9
End
2.4程序调试状况
第一次错误:
寄存器ax的高8位没有清零,使ax存储的数据不正确,结果出现错误。
与1和9比较大小时应用它们的ASCII码31h和39h,而不是直
接用1和9。
正确运行结果截图:
三.题24.3问题描述
内存中source处存放着一个以0为结束标志的ASCII码字符串。
请统计该字符串中字母,数字,空格和其他字符的个数,统计结果分别存放到字节型变量result处。
3.1寄存器及主存的应用说明
source处存放待检测字符串
Result处存放各种字符数量
si存储地址
cl存放si指向的字符
3.2程序框图(见第十一页)
3.3详细程序
ABCabc123+-*/'
resultdb4dup(0)
leasi,source-1;
si赋值source的首地址减1
incsi;
地址加1指向下一个字符
movcl,[si];
将指向的字符赋值给cl
cmpcl,0;
与0比较,如果是0,结束
cmpcl,2BH;
分别于加减乘除比较,如果是其中的
jzothers;
一个字符,跳转到others
cmpcl,2DH
jzothers
cmpcl,2AH
cmpcl,2FH
cmpcl,20h;
与空格比较,相等则跳转到space
jzspace
cmpcl,39h;
以上字符都不是则与9比较,
jbenum;
小于等于9则跳转到num
jmpwords;
如果以上都不是则为字母,跳转到words
others:
add[result+3],1;
其他字符数量加1并存到result第四个字节处
jmpagain;
继续执行搜索下一个字符
space:
add[result+2],1;
空格数量加1并存到result第三个字节处
num:
add[result+1],1;
数字数量加1并存到result第二个字节处
继续执行并搜索下一个字符
words:
add[result],1;
字母数量加1并存到result第一个字节处
3.4程序调试情况
错误:
最后的一段程序没有写jmpa