汇编实验.docx
《汇编实验.docx》由会员分享,可在线阅读,更多相关《汇编实验.docx(14页珍藏版)》请在冰豆网上搜索。
汇编实验
中南民族大学
学生实验报告
院系:
计算机科学学院
专业:
软件工程
年级:
2016级
课程名称:
0x86汇编语言
学号:
201621092056
姓名:
刘岱俊
指导教师:
熊志勇
2018年12月15日
年级
2016级
班号
2班
组号
学号
201621092056
专业
软件工程
姓名
刘岱俊
实验名称
分支程序设计——3.3计算函数值
实验室
9#204
实
验
目
的
或
要
求
实验目的
掌握80X8632位汇编语言程序设计的基本步骤,分析问题,确立算法。
根据程序算法流程选择合适的指令编制汇编语言源程序。
本实验着重掌握顺序程序设计的基本方法和技巧,熟练使用基本的I/O宏。
实验要求
(1)程序要结构化:
简明、易读和易调试。
(2)执行速度较快且占用存储空间较少。
实
验
原
理
(
算
法
流
程
)
1.题目分析:
输入一个字符,找出它的前导字符和后续字符,并按顺序显示这三个字符。
2.所需要达到的实验要求:
程序从键盘接收用户输入的一个字符后,然后分别找出它的前导字符和后续字符,再按顺序显示这三个字符。
在用户输入和显示字符之前都要有相应的提示信息。
3.构思:
从AL寄存器得到它的ASCII码,它的前导字符和后续字符的ASCII码分别比它的ASCII码少1或多1。
然后分别显示这三个字符。
4.代码实现
.DATA;启动主程序代码
…………
_start:
outputprompt1
inputchar4,3;读ASCII字符
moval,char4
movchar1,al
incal
movchar2,al
decal
decal
movchar3,al
outputlabel1
INVOKEExitProcess,0;退出,返回代码0
PUBLIC_start
END
组
内
分
工
(
可
选
)
个人完成,无组内分工
实
验
结
果
分
析
及
心
得
体
会
实验截图:
心得体会
通过本次试验,我掌握的汇编语言的基本操作,及通过ASCII码对字符进行操作。
掌握顺序程序设计的基本方法和技巧,熟练使用基本的I/O宏。
成
绩
评
定
教师签名:
年月日
年级
2016级
班号
2班
组号
学号
201621092056
专业
软件工程
姓名
刘岱俊
实验名称
分支程序设计——3.3计算函数值
实验室
9#204
实
验
目
的
或
要
求
实验目的
掌握分支程序设计的原理和方法,重点掌握各种分支程序中形成和判断条件而产生的程序段的设计方法和技巧。
实验要求
(3)如何产生条件
(4)如何对条件进行判断
(5)如何实现分支
实
验
原
理
(
算
法
流
程
)
1.题目:
计算给定函数值
2.实验要求:
编制程序,计算下面函数值
i.
ii.其中,从键盘输入x,y,输出数据为a。
iii.输入输出时候都要求有提示信息。
3.提示:
这个给出两种方法如下:
i.先输入x和y,然后用嵌套的IF结构来分别判断并给a赋值。
ii.分别为x和y设置一个标志变量,当值大于等于0时该变量等于1,当值小于0时该变量等于0。
然后用这两个变量进行异或操作,结果赋值给a。
(这个需要用到xor指令)。
4.代码实现
.DATA
.CODE
_start:
outputprompt1
inputstring,10
atoistring
movbx,ax
outputprompt2
inputstring,10
atoistring
movcx,0
cmpbx,0
jgeL1
cmpax,0
jlL2
L1:
cmpax,0
jgeL3
jmpL4
L2:
movcx,-1
jmpL4
L3:
movcx,1
L4:
itoaavalue,cx
outputoutstr1
INVOKEExitProcess,0;exitwithreturncode0
PUBLIC_start
END
组
内
分
工
(
可
选
)
个人完成,无组内分工
实
验
结
果
分
析
及
心
得
体
会
实验截图:
心得体会
本次试验我在试验中,根据提示输入两个整数,通过与0比较进行跳转,最后赋值输出,掌握分支程序设计的原理和方法,重点掌握各种分支程序中形成和判断条件而产生的程序段的设计方法和技巧。
。
成
绩
评
定
教师签名:
年月日
年级
2016级
班号
2班
组号
学号
201621092056
专业
软件工程
姓名
刘岱俊
实验名称
子程序设计—5.3求X的阶乘
实验室
9#204
实
验
目
的
或
要
求
实验目的
掌握子程序设计的原理和方法,重点掌握子程序编写和调用的过程以及堆栈操作和参数以及局部变量的概念。
实验要求
(1)编写子程序
(2)在主程序中调用子程序
(3)实现主程序与子程序的参数传递
实
验
原
理
(
算
法
流
程
)
1.1.题目:
求X的阶乘值
2.2.实验要求:
输入一个整型数(不超过10),求出其阶乘值后输出,求阶乘的算法用子程序来实现。
3.3.提示:
可以用递归来实现,也可以用简单的循环来实现。
。
4.代码实现:
.DATA
………..
.CODE
_start:
L1:
outputprompt1
inputstring,11
atodstring
cmpeax,0
jlL1
cmpeax,10
jgL1
pusheax
callFACT
INVOKEExitProcess,0
FACTPROCNEAR32
pushebp
movebp,esp
moveax,[ebp+8]
movecx,eax
cmpeax,0
jeL2
cmpeax,1
jeL2
dececx
forcount:
mulecx
loopforcount
jmpL3
L2:
moveax,1
L3:
dtoavalue,eax
outputresult
popebp
ret4
FACTENDP
PUBLIC_start
END
组
内
分
工
(
可
选
)
个人完成,无组内分工
实
验
结
果
分
析
及
心
得
体
会
实验截图:
心得体会
通过本次试验,我掌握子程序设计的原理和方法,重点掌握子程序编写和调用的过程以及堆栈操作和参数以及局部变量的概念
成
绩
评
定
教师签名:
年月日
源代码如下:
实验2.3代码:
;*********************************************************************
;Exampleassemblylanguageprogram--输入一个字符,找出它的前导字符和后续字符,并按顺序显示这三个字符
;Author:
刘岱俊
;studentnumber:
201621092056
;Date:
2018年12月1日。
;---------------------------------------------------------------------
.386
.MODELFLAT
;---------------------------------------------------------------------
ExitProcessPROTONEAR32stdcall,dwExitCode:
DWORD
;---------------------------------------------------------------------
INCLUDEio.h;输入/输出头文件
;---------------------------------------------------------------------
crEQU0dh;回车字符
LfEQU0ah;换行
;---------------------------------------------------------------------
.STACK4096;储备4096字节的堆栈
;---------------------------------------------------------------------
.DATA;启动主程序代码
prompt1BYTE"Thisprogramwilloutputthreecharacter",cr,lf
BYTE"Enteracharacter:
",0
label1BYTEcr,Lf,"Thethreecharacteris",cr,lf
char3BYTE?
BYTEcr,Lf
char1BYTE?
BYTEcr,lf
char2BYTE?
BYTEcr,lf,0
char4byte5dup(?
)
.CODE
_start:
outputprompt1
inputchar4,3;读ASCII字符
moval,char4
movchar1,al
incal
movchar2,al
decal
decal
movchar3,al
outputlabel1
INVOKEExitProcess,0;退出,返回代码0
PUBLIC_start
END
实验3.3代码:
;*********************************************************************
;Exampleassemblylanguageprogram--计算给定函数值
;Author:
刘岱俊
;studentnumber:
201621092056
;Date:
2018年12月1日。
;---------------------------------------------------------------------
.386
.MODELFLAT
;---------------------------------------------------------------------
ExitProcessPROTONEAR32stdcall,dwExitCode:
DWORD
;---------------------------------------------------------------------
INCLUDEio.h;输入/输出头文件
;---------------------------------------------------------------------
crEQU0dh;回车字符
LfEQU0ah;换行
;---------------------------------------------------------------------
.STACK4096;储备4096字节的堆栈
;---------------------------------------------------------------------
.DATA
prompt1byte"pleaseinputx:
",0
prompt2byte"pleaseinputy:
",0
stringbyte10dup(?
)
outstr1bytecr,lf,"a="
avaluebyte6dup(?
),cr,lf,0
.CODE
_start:
outputprompt1
inputstring,10
atoistring
movbx,ax
outputprompt2
inputstring,10
atoistring
movcx,0
cmpbx,0
jgeL1
cmpax,0
jlL2
L1:
cmpax,0
jgeL3
jmpL4
L2:
movcx,-1
jmpL4
L3:
movcx,1
L4:
itoaavalue,cx
outputoutstr1
INVOKEExitProcess,0;exitwithreturncode0
PUBLIC_start
END
实验5.3代码:
;*********************************************************************
;Exampleassemblylanguageprogram--5.3求X的阶乘
;Author:
刘岱俊
;studentnumber:
201621092056
;Date:
2018年12月1日。
;---------------------------------------------------------------------
.386
.MODELFLAT
;---------------------------------------------------------------------
ExitProcessPROTONEAR32stdcall,dwExitCode:
DWORD
;---------------------------------------------------------------------
INCLUDEio.h;输入/输出头文件
;---------------------------------------------------------------------
crEQU0dh;回车字符
LfEQU0ah;换行
;---------------------------------------------------------------------
.STACK4096;储备4096字节的堆栈
;---------------------------------------------------------------------
.DATA
prompt1BYTE'Calculatethefactorialofanumber:
',cr,lf
BYTE'Pleaseinputanumberthatisfrom0to10',cr,lf,0
stringBYTE20DUP(?
)
resultBYTE'Theresultis'
valueBYTE11DUP(?
)
BYTEcr,lf,0
.CODE
_start:
L1:
outputprompt1
inputstring,11
atodstring
cmpeax,0
jlL1
cmpeax,10
jgL1
pusheax
callFACT
INVOKEExitProcess,0;exitwithreturncode0
FACTPROCNEAR32
pushebp
movebp,esp
moveax,[ebp+8]
movecx,eax
cmpeax,0
jeL2
cmpeax,1
jeL2
dececx
forcount:
mulecx
loopforcount
jmpL3
L2:
moveax,1
L3:
dtoavalue,eax
outputresult
popebp
ret4
FACTENDP
PUBLIC_start;makeentrypointpublic
END;endofsourcecode