中南大学 汇编语言实验报告.docx
《中南大学 汇编语言实验报告.docx》由会员分享,可在线阅读,更多相关《中南大学 汇编语言实验报告.docx(20页珍藏版)》请在冰豆网上搜索。
![中南大学 汇编语言实验报告.docx](https://file1.bdocx.com/fileroot1/2023-1/7/76751421-4e89-4be5-a913-f3f6b3057911/76751421-4e89-4be5-a913-f3f6b30579111.gif)
中南大学汇编语言实验报告
中南大学汇编语言实验报告
计算机原理与汇编实验报告
学生姓名学号专业班级
指导教师贺建飚
学院信息科学与工程学院
完成时间2019年6月
实验一二进制转十六进制
一、实验目的
(1)掌握循环程序的设计方法。
(2)掌握汇编语言源程序的编辑、汇编、连接及调试过程。
(3)进一步熟悉利用DEBUG程序修改参数的方法,并检查和验证结果的正确性。
(4)学会针对不同的问题,选用不同的组织循环的方法。
二、实验要求
掌握循环程序的过程和汇编实现原理,进一步熟练掌握DEBUG操作指令以及汇编语言源程序的编辑、汇编、连接及调试过程。
三、实验内容
掌握循环排序算法的思想:
二进制到十六进制转换程序
实验代码如下:
assumecs:
code
codesegment
mainprocfar
start:
movbx,[**************]0b;待转换成十六进制的二进制数movch,4;设置循环次数
rotate:
movcl,4;设置循环左移的位数
rolbx,cl;将bx中的每位依次循环左移4位,
;每左移一次,把最高位同时移入CF和操作数最低位
moval,bl
andal,0fh;将al高4位清0,保留从rol循环移位到al低四位的值
addal,30h;将4位二进制数转换成对应的ASCII码
cmpal,3ah;判定4位二进制数是否大于9
jlprint
addal,7h
print:
movdl,al;调用中断程序输出单个字符
movah,2
int21h
decch;继续循环,直到循环4次为止
jnzrotate
mainendp
movax,4c00h
int21h
codeends
end
四、实验结果
DEBUG调试如下:
五、实验心得
编了这个程序之后发现,想要真正理解一个程序都是需要掌握众多助记符的用法以及它的意思,只有了解并明白了这些之后才可以分析程序或者是编写简单的小程序。
实验二起泡排序算法的程序实现
一、实验目的
(1)掌握循环程序的设计方法。
(2)掌握汇编语言源程序的编辑、汇编、连接及调试过程。
(3)进一步熟悉利用DEBUG程序修改参数的方法,并检查和验证结果的正确性。
(4)学会针对不同的问题,选用不同的组织循环的方法。
二、实验原理
循环结构分DO_WHILE和DO_UNTIL两种,无论使用哪种循环结构,循环程序一般应包括以下几部分:
①循环初始化。
它包括设置循环次数的初始值、地址指针的初始设置等。
②循环体。
这是循环工作的主体,包括要重复执行的操作,以及循环的修改部分。
修改部分包括地址指针的修改、循环控制条件的修改等。
③循环控制部分。
它是控制循环的关键,判断循环条件满足与否。
特别要注意循环入口和循环次数的正确设置、地址指针及循环控制条件的修改等。
否则会得不到期望的结果。
三、实验内容
掌握循环排序算法的思想:
起泡排序算法的程序实现
实验代码如下:
DATASSEGMENT
BUFFERDB100DUP(?
)
XDB5DUP(?
)
STRING1DB"PLEASEINPUTDATAS:
","$"
STRING2DB"AFTERSORTIS:
","$"
SHIFTDB13,10,'$'
SPACEDB20H,'$'
DATASENDS
STACKSSEGMENT
DB256DUP(?
)
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS,ES:
DATAS
START:
MOVAX,DATAS
MOVDS,AX
MOVES,AX
MOVAX,STACKS
LEASI,BUFFER
MOVCX,0
LEADX,STRING1
MOVAH,09H
INT21H
L1:
MOVAH,01H;/////////////////键盘输入转成数
INT21H
CMPAL,0DH
JEL2
CMPAL,20H
JEL3
XORAH,AH
SUBAX,30H
XCHGAX,BX
MOVDX,10
MULDX
ADDBX,AX
JMPL1
L3:
INCCX
MOV[SI],BL
ADDSI,1
XORBX,BX
JMPL1
L2:
LEADX,SHIFT
MOVAH,09H
INT21H
MOV[SI],BL
LEADI,X
MOV[DI],CL
LABLE2:
LEASI,BUFFER
PUSHCX
LABLE:
MOVAL,[SI]
CMPAL,[SI+1]
JBEL4
XCHGAL,[SI+1]
MOV[SI],AL
L4:
ADDSI,1;跳到回车处理;空格处理;/////////////存储到buffer中;/////////排序算法
POPCX
LOOPLABLE2
LEADX,STRING2
MOVAH,09H
INT21H
LEADI,BUFFER
L7:
MOVCX,2
MOVBH,[DI]
L6:
PUSHCX
MOVCL,4
ROLBX,CL
MOVDL,BL
ANDDL,0FH
CMPDL,9
JBEL5
ADDDL,7
L5:
ADDDL,30H
MOVAH,02H
INT21H
POPCX
LOOPL6
INCDI
LEADX,SPACE
MOVAH,09H
INT21H
LEASI,X
MOVBL,[SI]
CMPBL,0
DECBL
LEASI,X
MOV[SI],BL
JGEL7
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
四、实验结果;/////////////////////显示字符
DEBUG调试如下:
五、实验心得
1.在进行循环程序设计时,要注意循环初始化、内外层循环的控制、循环结束条件等的设置,对整个程序的执行逻辑要非常清楚,这样可以避免死循环等意外情况的出现。
2.多层循环的控制更为复杂,编写代码时,要注意注释重要的循环控制部分,这样思路才不会乱。
同时要对照流程图,随时观察代码的逻辑思路是否正确。
3.当要观察排序结果时,可利用D命令,显示数据段的内容,检查程序是否正常运行。
实验三查找匹配字符串
一、实验目的
(1)掌握循环程序的设计方法。
(2)掌握汇编语言源程序的编辑、汇编、连接及调试过程。
(3)进一步熟悉利用DEBUG程序修改参数的方法,并检查和验证结果的正确性。
(4)学会针对不同的问题,选用不同的组织循环的方法。
二、实验要求
掌握循环程序的过程和汇编实现原理,进一步熟练掌握DEBUG操作指令以及汇编语言源程序的编辑、汇编、连接及调试过程。
三、实验内容
掌握循环排序算法的思想:
查找匹配字符串:
程序接收用户键入的一个关键字以及一个句子。
如果句子中不包含关键字则显示‘NOmatch!
’;如果句子中包含关键字则显示‘MATCH’,且把该字在句子中的位置用十六进制数显示出来。
实验代码如下:
DATASEGMENT
mess1DB'Enterkeyword:
','$'
mess2DB'EnterSentence:
','$'
mess3DB'Matchatlocation:
','$'
mess4DB'NOTMATCH.',13,10,'$'
mess5DB'Hofthesentence',13,10,'$'
changeDB13,10,'$'
stoknin1labelbyte
max1db10
act1db?
stokn1db10dup(?
)
stoknin2labelbyte
max2db50
act2db?
stokn2db50dup(?
)
DATAENDS
STACKSSEGMENT
;此处输入堆栈段代码
STACKSENDS
CODESEGMENT
;*************************************代码段
mainprocfar
assumecs:
code,ds:
data,es:
data
START:
pushds
subAX,AX
subBX,BX
subDI,DI
subSI,SI
pushAX;为返回dos并清空后面要用到的寄存器
MOVAX,DATA
MOVDS,AX
LEADX,mess1
MOVah,09
INT21h;输出Enterkeyword
LEADX,stoknin1
MOVah,0ah;用21号中段的0ah号功能获取关键字
INT21h
cmpact1,0
jeexit;如果为空直接退出程序
a10:
;********************************输入Sentence并判断
LEADX,change
MOVah,09
INT21h;输出回程,换行
LEADX,mess2
MOVah,09
INT21h;输出EnterSentence:
LEADX,stoknin2
MOVah,0ah
INT21h;用21号中段的0ah号功能获取句子
MOVAL,act1
CBW
MOVCX,AX;保存关键字长度到cx
PUSHCX;cx入栈
MOVAL,act2
cmpAL,0
jea50;保存句子长度到al,若句子为空则跳转显示notmatchSUBAL,act1
jsa50;若句子长度小于关键字长度,则跳转显示notmatchINCAL
CBW
LEABX,stokn2;将句子的首地址放进BX
MOVDI,0
MOVSI,0
a20:
;****************************************比较,内循环
MOVAH,[BX+DI]
CMPAH,stokn1[SI];遇见字符不相等就跳转到a30
jnea30
INCDI
INCSI
DECCX;没遇到一个相等的字符,cx-1,cx不为0则比较下一个字符,当cx为0是说明关键字比较完
CMPCX,0
jea40
jmpa20
a30:
;*****************************************外循环,BX+1,清空si,di继续内循环比较INCBX
DECAL
cmpAL,0
jea50
MOVDI,0
MOVSI,0
POPCX
pushCX
jmpa20
a40:
;*****************************************match,将bx减去句子的首地址加一得到关键字所在位置,调用二进制转十六进制子函数将位置输出
SUBBX,offsetstokn2
INCBX
LEADX,change
MOVah,09
INT21h
LEADX,mess3
MOVah,09
INT21h
CALLbtoh
LEADX,mess5
MOVah,09
INT21h
jmpa10
;****************************************二进制转换十六进制
btohPROCNEAR
MOVCH,4
rotate:
MOVCL,4
ROLBX,CL
MOVAL,BL
andAL,0fh
addAL,30h
cmpal,3ah
jlprintit
addal,7h
printit:
MOVdl,al
MOVah,2
int21h
decch
jnzrotate
ret
btohendp
a50:
;*****************************************显示notmatch
LEADX,change
MOVah,09
INT21h
LEADX,mess4
MOVah,09
INT21h
jmpa10
exit:
ret
mainendp
CODEENDS
END
四、实验结果
五、实验心得
与第一次实验相比这次用到了数据段,应该注意数据段的定义和使用。
此外应该注意单个字符时的“边缘”情况,因为这时指针的移动和关键字的长度是一致的,但是这并不意味着,两个字符串匹配。
实验四求Fibonacci递归数
一、实验目的:
掌握子程序的设计方法,熟悉递归程序的设计。
二、实验要求:
掌握递归程序的调用、返回及入口、出口的传递方法。
三、实验内容
程序接受由用户键入的数N,根据给定的N值,计算Fibonacci数。
Fibonacci数的公式如下:
Fib
(1)=1;当n=1
Fib
(2)=1;当n=2
Fib(n)=Fib(n-1)+Fib(n-2)
实验代码如下:
DATASSEGMENT
;此处输入数据段代码
RESULTDB1D,24DUP(0)
XDB1D,24DUP(0)
MESS1DB0DH,0AH,'Pleaseinputadata:
','$'
MESS2DB0DH,0AH,'Theresultis:
','$'
MESS3DB0DH,0AH,'InputQ/qtoquit.','$'
MESS4DB0DH,0AH,'======================','$'
FLAGDW0DH
MESSERRORDB0DH,0AH,'Inputerror,pleasere-enter.','$'
QUITDB0DH,0AH,'YouhavetypedQ/qtoexit.','$'
DATASENDS
STACKSSEGMENT
;此处输入堆栈段代码
DW128DUP(?
)
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS,ES:
DATAS
START:
MOVAX,DATAS
MOVDS,AX
MOVES,AX
MOVAX,STACKS
MOVSS,AX
;此处输入代码段代码
REINPUT:
PUSHAX
PUSHBX
PUSHCX
PUSHDX
PUSHSI
PUSHDI
MOVAH,09
LEADX,MESS4
INT21H
LEADX,MESS3
INT21H
LEADX,MESS1
INT21H
MOVBX,0
INPUT:
MOVAH,01
INT21H
CMPAL,'q';
JZEND_
CMPAL,'Q';
JZEND_
CMPAL,0DH;
JZCONT
CMPAL,'0';
JBERROR;
CMPAL,':
'
JNBERROR
SUBAL,30H
CBW
XCHGAX,BX
MOVCX,10D
MULCX
XCHGAX,BX
ADDBX,AX
JMPINPUT
ERROR:
;
MOVAH,09
LEADX,MESSERROR
INT21H
JMPREINPUT
END_:
MOVAH,09
LEADX,QUIT
INT21H
INT21H
RET
CONT:
MOVCX,BX;
CMPCX,2
JLEPRINT;
SUBCX,2;
NEXT:
MOVDI,CX
MOVCX,25
MOVSI,0
ADDE:
MOVDL,X[SI]
MOVDH,RESULT[SI]
ADDDL,DH;
MOVRESULT[SI],DL
MOVX[SI],DH;
CMPDL,10D
JAEGREAT;
INCSI
JMPGOON
GREAT:
SUBRESULT[SI],10D;
INCSI
ADDX[SI],1;
GOON:
LOOPADDE
MOVCX,DI
LOOPNEXT
PRINT:
LEADX,MESS2
MOVAH,09
INT21H
MOVCX,25
MOVSI,24
DISPLAY1:
CMPFLAG,0;
JNZN2
CMPRESULT[SI],0
JZN3
ADDFLAG,1
N2:
MOVDL,RESULT[SI];
ADDDL,30H
MOVAH,02H
INT21H
N3:
DECSI
LOOPDISPLAY1
MOVFLAG,0
MOVRESULT[0],1D
MOVSI,1
MOVCX,24
INITIAL:
MOVRESULT[SI],0
MOVX[SI],0
ADDSI,1
LOOPINITIAL
MOVSI,0
POPDI;
POPSI
POPDX
POPCX
POPBX
POPAX
JMPREINPUT;
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
四、实验结果
五、实验心得
在程序的制作过程中,遇到了很多意想不到的困难,自己一个人解决起来有很大的困难,于是也少不了同学的帮助,深刻体会到开发程序不只是一两个人就能很好地完成的,要大家互相帮助,共同探讨问题,才能更好的解决困难。
实验五分类统计字符个数
一、实验目的
掌握分支程序设计的原理与方法,重点掌握各种程序中形成和判断条件而产生的程序段的设计方法和技巧。
二、实验要求
掌握分支程序的调用及基本子程序的编写,判断程序运行的顺序。
三、实验内容
程序接受用户输入一行字符,并按照字符串中字符所属的类型分类,将结果输出(例如:
aaabb1234&中,字母5,数字4,其他字符1)
实验代码如下:
DATASSEGMENT
STRING1DB'InputYourString:
$';输入提示信息
STRING2DB'Digit:
$';各类字符提示信息
STRING3DB'UpLetter:
$'
STRING4DB'LowLetter:
$'
STRING5DB'Others:
$'
DIGITDB0;数字
ALPHAUDB0;大写字母
ALPHALDB0;小写字母
OTHERSDB0;其他
DATASENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS
START:
MOVAX,DATAS
MOVDS,AX
LEADX,STRING1;显示输入提示信息
MOVAH,9
INT21H
MOVCX,100;设置循环次数主够大
L1:
MOVAH,1;中断调用,单字符输入
INT21H
CMPAL,0DH;若输入回车符则结束
JZOVER2
CMPAL,30H
JBOTHER;若
CMPAL,39H;若>39H(9),跳转进一步比较
JAHIGHER1
JMPDIGITAL;DIGIT++
HIGHER1:
CMPAL,41H;if
JBOTHER
CMPAL,5AH;if>5AH(Z),跳转继续比较
JAHIGHER2
JMPUALPHA;ALPHAU++
HIGHER2:
CMPAL,61H;if
JBOTHER
CMPAL,7AH;if>7AH(z),OTHERS++
JAOTHER
JMPLALPHA;ALPHAL++
JMPOVER;比较结束
OTHER:
INCOTHERS;OTHERS++
JMPOVER
DIGITAL:
INCDIGIT;DIGIT++
JMPOVER
LALPHA:
INCALPHAL;ALPHAL++
JMPOVER
UALPHA:
INCALPHAU;ALPHAU++
JMPOVER
OVER:
NOP
LOOPL1;循环,输入下一字符
OVER2:
CALLENDLINE;回车换行
LEADX,STRING2;输出提示信息
MOVAH,9
INT21H
XORAX,AX
MOVAL,DIGIT;将统计的数字送AX,为输出做准备
CALLDISPLAY;调用输出两位数字的子程序
CALLENDLINE;下同
LEADX,STRING3
MOVAH,9
INT21H
XORAX,AX
MOVAL,ALPHAU
CALLDISPLAY
CALLENDLINE
LEADX,STRING4
MOVAH,9
INT21H
XORAX,AX
MOVAL,ALPHAL
CALLDISPLAY
CALLENDLINE
LEADX,STRING5
MOVAH,9
INT21H
XORAX,AX
MOVAL,OTHERS
CALLDISPLAY
MOVAH,4CH
INT21H
ENDLINEPROCNEAR;控制输出格式,输出回车换行子程序
MOVAH,2
MOVDL,0AH
INT21H
MOVAH,2
MOVDL,0DH
INT21H
RET
ENDLINEENDP
DISPLAYPROCNEAR;输出两位数字的子程序
MOVBL,10;10送BL
DIVBL;AX/BL,AL=商,AH=余数
PUS