计算机输入输出课程汇编实验部分文档格式.docx
《计算机输入输出课程汇编实验部分文档格式.docx》由会员分享,可在线阅读,更多相关《计算机输入输出课程汇编实验部分文档格式.docx(20页珍藏版)》请在冰豆网上搜索。
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码SUBAL,30H使的转换为数字
运用子程序调用可以使主程序看起来更加简洁明了,且易于调试,维护
LFCR回车换行需注意将ax压栈,以便调用int21h的输出功能
Crlfdb0ah,0dh,"
即为回车换行
实验六
ProgrammingasubroutinetocalculateN!
.Specificrequirements:
ReadanumberN(1~6)fromkeyboard,programmingasubroutinenamedDACtocalcuteN!
thenprinttheresulttoscreenindecimalform.
NUMBERDB?
STRdb0AH,0DH,'
youmustinput1~6'
OUTPUTDB20H,4DUP(20H),'
MOVBX,10
MOVSI,4
L:
IDIVBX
ADDDX,30H
MOVOUTPUT[SI],DL
MOVDX,0
DECSI
CMPSI,0
JGL
CHECK0:
INCSI
CMPOUTPUT[SI],30H
JNZRIGHT
MOVOUTPUT[SI],'
'
CMPSI,4
JLCHECK0
RIGHT:
LEADX,OUTPUT
MOVAH,9
INT21H
RET
LEADX,NUMBER
JBEexit
CMPAL,07H
JAEEXIT
MOVCL,AL
MOVCH,0H
MOVAX,1
IMULCX
LOOPNZLP
MOVAH,09H
一开始输出的十进制数带0,如0720,0002等,后检测为0即赋值20H(空格),发现6!
=72,不仅去掉了开头的0,也去掉了末尾的0,将NUMBER由+1至+4检查,遇到非0的数就退出检测可以解决。
实验七
在附加段中有一个从小到大排序的无符号数字数组,其首地址在DI中,数组的第一个单元存放数组长度。
要求用折半查找法在数组中查找数N,假设该数已在AX中,如找到,CF=0,并在SI中给出该元素在数组中的偏移地址;
如未找到,CF=1。
TABLEdb1,4,7,9,16,31,36,49
nDB1
rdb7
ldb0
MOVdi,offsetTABLE
movbl,n
movcl,2
check:
MOVal,r
cmpal,l
addal,l
movah,0
divcl
movah,0
addsi,ax
cmp[si],bl
jlright
movr,al
jmpcheck
right:
movl,al
jmpcheck
subah,1
jmpexit
cmpax,0
查找数字n=1(BX),得数组中序号0,即Table[0(AX)]=1满足搜索条件,使CF=0(NC),并用movsi,diaddsi,ax使得si获得Table[0(AX)]的偏移地址。
一开始divcl时忘记将AH设置成0,结果一直循环DIVC;
[SI+BI],IRET
MOVAH,0后恢复正常
实验八
在内存中有一个数组,里面是放着10个学生的某科的成绩,分别是:
85,73,92,66,91,98,52,87,83,68,请用冒泡排序法将这10个数从大到小排序,并将排序的结果在屏幕上打印出来,要求一个数一行的格式输出。
nequ10
BUFFERDB85,73,92,66,91,98,52,87,83,68
MOVBL,10
MOVSI,0
moval,BUFFER[si]
IDIVBL
MOVCX,AX
MOVDl,CL
ADDDL,30H
MOVDl,CH
LEADX,CRLF
INCSI
CMPSI,10
JLL
movcx,n
deccx
loop1:
movdi,cx
movbx,0
loop2:
moval,buffer[bx]
cmpal,buffer[bx+1]
jgecontinue
xchgal,buffer[bx+1]
movbuffer[bx],al
continue:
addbx,1
looploop2
movcx,di
looploop1
callPRINT
movah,4ch;
程序结束,返回到操作系统系统
int21h
ENDstart
即可实现换行
注意输出字符时需转换成ASCII以便输出,idiv10,先输出商再输出余数