计算机输入输出课程汇编实验部分Word文档下载推荐.docx
《计算机输入输出课程汇编实验部分Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《计算机输入输出课程汇编实验部分Word文档下载推荐.docx(20页珍藏版)》请在冰豆网上搜索。
assumeds:
data,cs:
code
start:
movax,data
movds,ax
leadx,buff
movah,0ah
int21h
leadx,crlf
movah,9h
leasi,buff+2h
movcl,buff+1h
next:
cmpcl,0h
jefinish
movdl,byteptr[si]
movah,2h
deccl
incsi
jmpnext
finish:
movah,4ch
codeends
endstart
2)运行结果贴图
3)编程与调试心得(遇到的问题和解决的办法,以及获得的收获)
一开始写buffbyte255显示error,换成buffdb255可以运行
Crlfdb0ah,0dh,"
关键在于获取字符串的长度,会存储在buff+1h中
也可在末尾加‘$’表示结尾。
实验二
通过这一部分的实验,进一步熟悉汇编过程和DEBUG调试过程;
掌握用汇编语言编写顺序程序。
2.写完整程序16位程序,在内存中从Table开始的10个单元中连续存放0到9的平方值,任给一个0到9的数X,该数存放在内存单元XX中,用XLAT指令查表求X的平方值,并将结果存于内存YY单元中。
编写程序,并在DEBUG中进行调试和验证结果。
(X,XX,YY都是内存中的变量)
.8086
.MODELSMALL
.STACK
.DATA
TABLEdb0,1,4,9,16,25,36,49,64,81
RESULTDB?
.CODE
START:
MOVAX,@DATA
MOVDS,AX
MOVBX,offsetTABLE
MOVAH,01H
INT21H
SUBAL,30H
XLAT
MOVRESULT,AL
leadx,crlf;
输出回车换行
MOVDL,RESULT
MOVAH,02H
EXIT:
MOVAH,4CH
运行debug,-u反汇编-g至001E,输入值6,查表应为36,即24H(00100100)
查ASCII为$,图0076A:
0030位置即为result值(通过对比一开始的存储单元得出)
一开始没有注意到输入的AL是ASCII码,应当减去30H
数据存储在result中可以用-d查询,学会了使用反汇编和查询存储单元
通过输出是ASCII码,如9对应result的81,即51H,查表恰为Q
说明存储正确(可用除10或循环移位的方法,单个数转为十进制数输出)
实验三
通过本实验,熟练使用字符串的输入、读取与判断,通过实验,可以掌握循环结构的各种实现方法,进一步了解循环结构中初始化部分、循环体部分、循环控制部分的功能以及他们彼此之间的关系。
尤其是多重循环中外层循环和内层循环之间的关系。
所谓回文字符串是指一个字符串正读和倒读都是一样的,例如字符串‘ABCDEFFEDCBA’就是一个回文字符串,而字符串‘ABCFDDCAB’就不是回文字符串。
现在编写完整的16位汇编程序,输入一个字符串,判断该字符串是否为回文字符串,并用“Itisapalindrome”或“ItisNOTapalindrome”作为输出。
buffdb255
db?
db255dup(?
YDB"
Itisapalindrome$"
NDB"
ItisNOTapalindrome$"
movax,data
movds,ax
movbl,buff+1h
movbh,0h
movdi,2h
adddi,bx
movsi,1h
decbl
decbl
decdi
cmpbl,0h
movdl,buff[si]
movdl,buff[di]
int21h
movdl,"
"
moval,buff[si]
movcl,buff[di]
cmpcl,al
jneno
no:
movdx,offsetN
movah,09h
movdx,offsetY
INT21H
本程序存在bug,如上图当输入abvcba时可以将abvcab与abcvba逐个字对比,发现第三个字符不同转入no段提示“ItisNOTapalindrome”,而当输入确实为回文时首字母错误,原因实在是查不出来。
实验四
实验目的
熟悉如何在数组中进行查找,并返回是否成功的信息,通过实验,可以掌握循环结构的各种实现方法,进一步了解循环结构中初始化部分、循环体部分、循环控制部分的功能以及他们彼此之间的关系。
实验内容
2请编写16位完整汇编程序,在一个升序字节数组BUFF中查找数N,找到后将此数从数组中删除,并使得CF=0;
没找到返回CF=1。
.modelsmall
.data
buffdb'
abcdefghijklmn'
'
$'
Ndb'
n'
.code
movdx,@data
movds,dx
moval,N
mov,ah,'
leadi,buff
finding:
incdi
cmpal,[di]
jzyes
cmpah,[di];
检测是否读完buff
jzno
jmpfinding
yes:
addah,0
movsi,di
setarray:
jzexit
movcl,[si]
mov[di],cl
incdi
jmpsetarray
movah,0
cmpah,1;
设置cf
exit:
movah,4ch
endstart
NC说明CF=0,查找到数N,查看存储单元由'
,‘n’变为’abcdefghijklm’,’$’,’n’已将数组中的数n删去
运用反汇编-u得到每个指令的地址,利用-g断点地址快速让程序运行到特定指令位置,可以方便快捷地排查错误
进位标志CF(Carryflag)CY
(1)NC(0)
实验五
通过本实验,掌握子程序的定义和调用方法。
通过程序调试,进一步理解CALL指令和RET指令的功能,掌握子程序调用时参数传递的方法。
请编写完整16位汇编程序从键盘读取字符,如果是十进制的‘0’~‘9’则在屏幕上输出该数的8位二进制码,并将数字依次存放到BUF开头的数组中,如果读入的字符是’Q’或者‘q’,则程序退出,其他情况在屏幕上打印“Youmustinput0~9,or‘q’or‘Q’”。
(如输入的字符是‘9’,则输出“00001001”).提示:
输出一个数的2进制形式应该从最高位开始输出。
要求打印一个数的2进制形式和输出回车换行分别定义成一个子程序可以将此段程序定义成一个过程。
.stack
STRdb'
youmustinput0~9orq,Q'
LFCRPROC
PUSHAX
MOVAH,02
MOVDL,0AH
POPAX
RET
LFCRENDP
PRINTPROC
JLT
CMPAL,9
JGT
MOVCX,8
LP:
MOVDL,0
SHLAL,1
ADCDL,30H
LOOPLP
JMPR
T:
LEADX,STR
MOVAH,09H
R:
PRINTENDP
MOVCX,-1
L:
CMPAL,'
Q'
JZexit
q'
CALLLFCR
CALLPRINT
POPCX
DECCX
PUSHCX
JNZL
输入的AH是ASCII码SUB