汇编语言实验报告.docx
《汇编语言实验报告.docx》由会员分享,可在线阅读,更多相关《汇编语言实验报告.docx(25页珍藏版)》请在冰点文库上搜索。
汇编语言实验报告
中南民族大学
学生实验报告
院系:
计算机科学学院
专业:
计算机科学与技术
年级:
2012级
课程名称:
汇编语言
学号:
2012213537
姓名:
郑凯伦
指导教师:
雷建云
2014年6月18日
年级
2012
班号
1202班
学号
2012213537
专业
计算机科学与技术
姓名
郑凯伦
实验名称
实验2.1计算成绩总分和平均分
实验
类型
设计型
综合型
创新型
设计型
实
验
目
的
或
要
求
一、掌握顺序程序设计的基本方法和技巧,熟练使用基本的I/O宏
二、程序要结构化,简明、易读和易调试。
三、执行速度较快且占用存储空间少。
实
验
原
理
程序设计流程:
1. 程序接收用户键入的4个成绩,并计算出这4个成绩的总分和平均分数。
在用户键入每个成绩和显示总分和平均分数之前都要有相应的提示信息。
当用户输入的成绩不在[0,100]之间时,显示错误信息并重新等待正确输入。
2.首先在数据段中定义提示信息、累计总分变量sum和平均分数变量average。
程序一开始初始化sum值为0,当用户每输入一个成绩后累加到sum中。
4个成绩输入完成后,sum内的值除以4得到平均分数并保存到average中。
最后显示计算结果。
代码:
;Exampleassemblylanguageprogram--addsfournumberstocalculatetheirsaverage
;Author:
Karllen
;Date:
10/5/2014
.386
.MODELFLAT
ExitProcessPROTONEAR32stdcall,dwExitCode:
DWORD
INCLUDEio.h;headerfileforinput/output
crEQU0dh;carriagereturncharacter
LfEQU0ah;linefeed
.STACK4096;reserve4096-bytestack
.DATA
promot1BYTE"PleaseEnterfournumberstocaclutetheaverage",cr,Lf,0
promot2BYTE"PleaseEnteranumberfrom0to100!
",0
promot3BYTE"Thenumberisn'tfrom0to100,pleaseEnterarightnumber",0
valueBYTE16DUP(?
)
实
验
原
理
(
算
法
流
程
)
numberDWORD?
sumDWORD?
answerBYTE"Thefournumbers'averageis"
aveBYTE11DUP(?
)
BYTEcr,LF,0
.CODE
_start:
outputpromot1
movsum,0
movebx,0
firstagain:
outputpromot2
inputvalue,16
atodvalue
judge:
cmpeax,100;num>100转移重新输入
jgdoif
cmpeax,0;num<0转移重新输入
jldoif
jmpaddSum;满足0<=num<=100
doif:
outputpromot3
inputvalue,16
atodvalue
jmpjudge
addSum:
incebx
addsum,eax
cmpebx,4
jnefirstagain;endfirstagain
moveax,sum
cdq;将sum拓展为64位
idivebx
dtoaave,eax
outputanswer
INVOKEExitProcess,0;exitwithreturncode0
PUBLIC_start;makeentrypointpublic
END;endofsourcecode
(写不完时,可另加附页。
)
年级
2012级
班号
1202班
学号
2012213537
专业
计算机科学与技术
姓名
郑凯伦
实验名称
实验3.1分类统计字符个数
实验
类型
设计型
综合型
创新型
设计型
实
验
目
的
或
要
求
一、掌握分支程序设计的原理和方法,重点掌握各种分支程序中形成和判断条件而产生的程序设计的设计方法和技巧。
二、掌握如何产生条件,如何对条件判断,如何实现分支。
实
验
原
理
程序设计流程:
1、程序接收用户输入的一行字符(字符个数不超过80个,该字符串以回车符结束),并按字母、数字及其它字符分类计数,然后将结果分别显示出来。
要求有信息提示用户按照要求输入字符串,三类字符的个数分别在三行显示,并指明是哪类字符。
;Exampleassemblylanguageprogram--
;Author:
Karllen
;Date:
revised5/2014
.386
.MODELFLAT
ExitProcessPROTONEAR32stdcall,dwExitCode:
DWORD
INCLUDEio.h;headerfileforinput/output
crEQU0dh;carriagereturncharacter
LfEQU0ah;linefeed
.STACK4096;reserve4096-bytestack
.DATA
promotBYTE"请输入一段字符串,分别统计字母,数字,和其他字符的个数",cr,Lf,0
valueBYTE1DUP(?
)
answerLetterBYTE"字母的个数:
"
letterBYTE11DUP(?
)
BYTEcr,Lf,0
aswerNumberBYTE"数字的个数:
"
numberBYTE11DUP(?
)
BYTEcr,Lf,0
answerOtherBYTE"其他字符的个数:
"
otherBYTE11DUP(?
)
BYTEcr,Lf,0
实
验
原
理
(
算
法
流
程
)
.CODE
_start:
moveax,0
movebx,0
movecx,0
outputpromot
while:
inputvalue,1
cmpvalue,0dh
jeendWhile;如果回车则结束
cmpvalue,30h;30h=0
jlforOther;小于30h为字符
;下面执行大于等于30h
cmpvalue,3Ah;39h=9
jlforNumber;小于3Ah为数字
;下面执行大于等于3Ah
cmpvalue,41h;小于41h为字符
jlforOther;41h=A
;下面执行大于41h
cmpvalue,5Bh;小于5Bh为大写字母
jlforLetter;5Bh=|
;下面执行大于5Bh
cmpvalue,61h;61h=a
jlforOther
;下面执行大于61h
cmpvalue,7Bh;7Bh={
jlforLetter
;下面执行7Bh到结束
jmpforOther
forLetter:
inceax
jmpwhile
forNumber:
incebx
jmpwhile
forOther:
incecx
jmpwhile
(写不完时,可另加附页。
)
实
验
原
理
(
算
法
流
程
)
endWhile:
dtoaletter,eax
dtoanumber,ebx
dtoaother,ecx
outputanswerLetter
outputanswerNumber
outputanswerOther
INVOKEExitProcess,0;exitwithreturncode0
PUBLIC_start;makeentrypointpublic
END;endofsourcecode
年级
2012级
班号
1202班
学号
2012213537
专业
计算机科学与技术
姓名
郑凯伦
实验名称
实验4.1求毕达哥拉斯三角形的边
实验
类型
设计型
综合型
创新型
设计型
实
验
目
的
或
要
求
一、掌握循环程序设计的原理和方法,重点掌握循环程序结构的形式和常用循环程序的控制方法和技巧。
二、要求学会置循环参数的初值,掌握循环体构成,学会如何实现循环控制。
实
验
原
理
设计流程:
1.一个毕达哥拉斯三角形的三条边是由三个正整数A、B和C组成,从而A2+B2=C2。
例如,数字3、4、5,由于9+16=25,而形成一个毕达哥拉斯三角形。
写一段完整的汇编程序,实现输入一个值给C,然后显示值为C时,所有可能的毕达哥拉斯三角形。
例如,如果输入5作为C的值,那么输出可以是:
ABC
345
435
2.由于C边的值已经给定,建立一个双重循环,外循环将A初值设1,每次循环加1,直到等于C-1;内循环将B值设为1,每次循环加1,直到等于C-1。
在内循环中如果A2+B2=C2成立,则当前的A、B、C是一个毕达哥拉斯三角形的边,并显示,如果不成立,继续循环。
代码:
;Exampleassemblylanguageprogram--
;Author:
Karllen
;Date:
revised5/2014
.386
.MODELFLAT
ExitProcessPROTONEAR32stdcall,dwExitCode:
DWORD
INCLUDEio.h;headerfileforinput/output
crEQU0dh;carriagereturncharacter
LfEQU0ah;linefeed
实
验
原
理
(
算
法
流
程
)
.STACK4096;reserve4096-bytestack
.DATA
promotBYTE"PleaseEnteranumberasthemaxslide",0
valueBYTE40DUP(?
)
ncDWORD?
naDWORD?
nbDWORD?
nDWORD?
answerBYTE"ABC",0
crLfBYTEcr,Lf,0
.CODE;startofmainprogramcode
_start:
movebx,0
movecx,0
outputpromot
inputvalue,40
atodvalue
movnc,eax
movn,eax
mulnc
movnc,eax;C*C
outputanswer
outputcrLf
doFirstWhile:
incebx
movecx,0
cmpebx,n
jgeendFirstWhile;大于等于n则转移
moveax,ebx
mulebx
movna,eax;A*A
doSecondWhile:
incecx
cmpecx,n
jgeendSecondWhile;大于等于n则转移
;执行比较
(写不完时,可另加附页。
)
实
验
原
理
(
算
法
流
程
)
moveax,ecx
mulecx;B*B
movnb,eax
movedx,nb
addedx,na;A*A+B*B
cmpedx,nc
jnestanIf;不等于则转移
;outputanswer
dtoavalue,ebx
outputvalue
dtoavalue,ecx
outputvalue
dtoavalue,n
outputvalue
outputcrLf
jmpdoSecondWhile
stanIf:
jmpdoSecondWhile
endSecondWhile:
jmpdoFirstWhile
endFirstWhile:
INVOKEExitProcess,0;exitwithreturncode0
PUBLIC_start;makeentrypointpublic
END;endofsourcecode
(写不完时,可另加附页。
)
年级
2012级
班号
1202班
学号
2012213537
专业
计算机科学与技术
姓名
郑凯伦
实验名称
实验5.1数组排序
实验
类型
设计型
综合型
创新型
设计型
实
验
目
的
或
要
求
一、掌握子程序设计的原理和方法,重点掌握子程序编写和调用的过程以及堆栈操作和参数以及局部变量的概念。
二、学会编写子程序,在主程序中调用子程序,能良好的实现子程序的参数传递。
实
验
原
理
设计流程:
1.给定一个数组,数组包含10个整型元素,将其按照从小到大的顺序排列后输出,要求排序的算法用子程序来实现。
例如,输入的数组元素为1,3,-9,5,12,0,-3,-12,24,34,那么输出是:
-12,-9,-3,0,1,3,5,12,24,34。
2.本程序采用冒泡排序对数组内的元素进行排序。
;Exampleassemblylanguageprogram--addstwonumbers
;Author:
karllen
;Date:
revised5/2014
.386
.MODELFLAT
ExitProcessPROTONEAR32stdcall,dwExitCode:
DWORD
INCLUDEio.h;headerfileforinput/output
crEQU0dh;carriagereturncharacter
LfEQU0ah;linefeed
.STACK4096;reserve4096-bytestack
.DATA
iDWORD?
jDWORD?
tempDWORD?
promot1BYTE"PleaseEntertennumberstosortfrommintomax",cr,Lf,0
arrayDWORD10DUP(?
)
promot2BYTE"Thenumbersthataresortedis",cr,Lf,0
valueBYTE11DUP(?
)
BYTEcr,Lf,0
实
验
原
理
(
算
法
流
程
)
.CODE
sortArrayPROCNEAR32
pushebp;建立堆栈
movebp,esp
movi,0
movedx,10
;movebx,[ebp+8];取得数组地址
sortFirst:
movebx,[ebp+8]
inci
cmpi,9
jgendsortFirst;大于9则跳转,
subedx,i;求edx-i
movj,0
sortSecond:
incj
cmpj,edx
jgendsortSecond;大于10-i则转移
moveax,[ebx]
movecx,[ebx+4]
cmpeax,ecx;cmp[ebx],[ebx+4]
jlendCMP;[ebx]<[ebx+4]则转移
movedx,eax
mov[ebx],ecx
mov[ebx+4],edx
;swap
endCMP:
addebx,4
movedx,10
jmpsortSecond
endSortSecond:
jmpsortFirst
endsortFirst:
popebp
ret
sortArrayENDP
(写不完时,可另加附页。
)
实
验
原
理
(
算
法
流
程
)
_start:
outputpromot1
movecx,0
leaebx,array
doFirstWhile:
incecx
cmpecx,10
jgendFirstWhile;大于10则结束
inputvalue,11
atodvalue
mov[ebx],eax
addebx,4
jmpdoFirstWhile
endFirstWhile:
leaeax,array
pusheax
callsortArray
addesp,4
outputpromot2
movecx,0
leaebx,array
doSecondWhile:
incecx
cmpecx,10
jgendSecondWhile
dtoavalue,[ebx]
outputvalue
addebx,4
jmpdoSecondWhile
endSecondWhile:
INVOKEExitProcess,0;exitwithreturncode0
PUBLIC_start;makeentrypointpublic
END;endofsourcecode
(写不完时,可另加附页。
)
年级
2012级
班号
1202班
学号
2012213537
专业
计算机科学与技术
姓名
郑凯伦
实验名称
实验6.1比较两个字符串
实验
类型
设计型
综合型
创新型
设计型
实
验
目
的
或
要
求
一、掌握串操作的用法,熟悉基本的串操作指令。
二、根据前面的所学知识,掌握对串操作的应用。
实
验
原
理
流程分析:
1.写一程序,比较两个字符串String1和String2所含的字符是否相同;若相同则显示’Match’,否则显示’No Match’。
2.输入两个字符串之后,将串操作所必须的寄存器等参数设置好,然后使用串操作指令进行从头到尾的比较,两个字符串相等的条件是串长度相等且对应的字符相同。
代码如下:
;Exampleassemblylanguageprogram--
;Author:
Karllen
;Date:
revised5/2014
.386
.MODELFLAT
ExitProcessPROTONEAR32stdcall,dwExitCode:
DWORD
INCLUDEio.h;headerfileforinput/output
crEQU0dh;carriagereturncharacter
LfEQU0ah;linefeed
.STACK4096;reserve4096-bytestack
.DATA
str1BYTE80DUP(?
)
str2BYTE80DUP(?
)
valueBYTE11DUP(?
)
length1DWORD?
length2DWORD?
实
验
原
理
(
算
法
流
程
)
promot1BYTE"PleaseEnterString1",cr,Lf,0
promot2BYTE"PleaseEnterString2",cr,Lf,0
crlfBYTEcr,Lf,0
answerYesBYTE"Match",cr,Lf,0
answerNoBYTE"NoMatch",cr,Lf,0
PUBLIC_start;makeentrypointpublic
.CODE;startofmainprogramcode
_start:
outputpromot1
inputstr1,80
leaeax,str1
pusheax
callstrlen
addesp,4
movlength1,eax
dtoavalue,eax
outputvalue
outputcrlf
outputpromot2
inputstr2,80
leaeax,str2
pusheax
callstrlen
addesp,4
movlength2,eax
dtoavalue,eax
outputvalue
outputcrlf
movedx,length2
;;cmpString1andString2
cmpeax,edx;如果长度不相等
jneendCMP;则结束
;比较
leaesi,str1
leaedi,str2
movecx,length2;比较的长度
re