合肥工业大学汇编语言程序设计实验报告.docx
《合肥工业大学汇编语言程序设计实验报告.docx》由会员分享,可在线阅读,更多相关《合肥工业大学汇编语言程序设计实验报告.docx(28页珍藏版)》请在冰点文库上搜索。
合肥工业大学汇编语言程序设计实验报告
合肥工业大学
计算机与信息学院
实验报告
课程:
汇编语言程序设计
专业班级:
学号:
姓名:
实验一Debug程序的使用
一.实验目的
1、熟悉DEBUG程序中的命令,学会在DEBUG下调试运行汇编语言源程序。
2、掌握8086/8088的寻址方式及多字节数据的处理方法。
二.实验内容
实验内容:
1、利用DEBUG程序中的“E”命令,将两个多字节数“12345678H”和“FEDCBA98H”分别送入起始地址为DS:
0200H和DS:
0204H两个单元中。
2、分别用直接寻址方式和寄存器间接寻址方式编写程序段,实现将DS:
0200H单元和DS:
0204H单元中的数据相加,并将运算结果存放在DS:
0208H单元中。
实验要求:
本次实验的内容均在DEBUG下完成,实现数据的装入、修改、显示;汇编语言程序段的编辑、汇编和反汇编;程序的运行和结果检查。
三.实验过程和程序
1、启动DOS操作系统
2、运行DEBUG.COM程序(若当前盘为C)
C:
>DEBUG↙
–;(“–”为DEBUG提示符,仅当屏幕出现该提示符后,才可输入DEBUG命令)
3、用“A”命令编辑和汇编源程序
–A↙
186E:
0100MOVAX,[0200]↙
186E:
0103MOVBX,[0202]↙
186E:
0107ADDAX,[0204]↙
186E:
010BADCBX,[0206]↙
186E:
010FMOV[0208],AX↙
186E:
0112MOV[020A],BX↙
186E:
0116↙
4、用“U”命令反汇编验证源程序
–UCS:
0100↙
186E:
0100A10002MOVAX,[0200]
186E:
01038B1E0202MOVBX,[0202]
186E:
010703060402ADDAX,[0204]
186E:
010B131E0602ADCBX,[0206]
186E:
010FA30802MOV[0208],AX
186E:
0112891E0A02MOV[020A],BX
186E:
0116
注意:
1)检查源程序是否有错误,若有则返回到第3步用“A地址”命令进行修改,直到程序无错误。
2)DEBUG约定在其命令或源程序中所涉及到的数据均被看作十六进制数,其后不用“H”说明。
3)在DEBUG下,源程序中不能使用“标号”、“变量”和一些伪指令。
4)在DEBUG下,大小写不敏感。
5、程序未执行前,用“R”命令观察,相关寄存器的内容。
–R↙
如:
(AX)=0000H,(BX)=0000H,(SI)=0000H,
(DI)=0000H,(CS)=13F5H,(IP)=0100H。
6、在程序未执行前,用“D”命令观察DS:
0200H,DS:
0204H、DS:
0208H单元的内容
–D20020B↙
7、用“G”命令运行源程序
–G=1000116↙
8、再用“D”命令观察DS:
0200H~DS:
020BH字节单元中的内容
–D20020B↙
9、用“T”单步操作命令对源程序单步执行,观察AX、BX、CS、IP寄器内容的变化,并与预计的结果相比较。
注意:
D命令显示内存数据,注意观察多字节数据在内存中的存放方式。
指令执行的时。
程序运行结果:
(AX)=1110H,(BX)=1111H
DS:
0208H四字节单元的内容:
11111110H
四.实验结果(包括必要的截图)
五.实验体会
通过这次实验的练习,我熟悉了在DEBUG的环境下,汇编程序中的命令,并且学会调试运行汇编语言源程序,掌握8086/8088的寻址方式及多字节数据的处理方法。
虽然自己动手实现了简单的计算的中间出现了很多错误,但是在查阅书本以及在老师和同学的帮助下完成了实验任务。
实验二汇编语言程序设计(顺序、循环)
一.实验目的
1、掌握顺序和循环程序结构和设计方法;
2、熟悉在PC机上建立、汇编、连接、调试和运行8086/8088汇编语言程序的过程。
二.实验内容
1、X、Y、Z、V均为字变量,在X、Y、Z、V字单元中存放是16位带符号数。
试编写汇编语言程序完成以下功能:
①计算表达式值(V–(X*Y+Z-720))/X;
②将上述表达式运算结果整数放在SUM1单元,余数放在SUM2单元。
2、求一个班50名学生成绩的平均值(附加题:
最大值和最小值,并将结果显示出来)
3、从键盘读入一个字符串,以Enter结束,字符串不超过50个字符,并打印该字符串(附加题:
查找中间是否有‘asm’子串。
如果有,输出‘Yes’;否则,输出‘No’)。
三.实验过程和程序
1)datasegment
xdw1
ydw0
zdw0
vdw0
sum1dw?
sum2dw?
dataends
codesegment
assumecs:
code,ds:
data
start:
movax,data
movds,ax
movax,x
imuly
movcx,ax
movbx,dx
movax,z
cwd
addcx,ax
adcbx,dx
subcx,720
sbbbx,0
movax,v
cwd
subax,cx
sbbdx,bx
idivx
movsum1,ax
movsum2,dx
movax,4c00h
int21h
codeends
endstart
2datasegment
gradedw98,98,96,95,94,93,87,86,85,97,86
dataends
codesegment
assumecs:
code,ds:
data
start:
movax,data
movds,ax
xorax,ax
movcx,11
movbx,offsetgrade
loop1:
addax,[bx]
incbx
incbx
looploop1
movcx,11
idivcx
movbx,ax
movax,4c00h
int21h
Codeends
endstart
3)DATA SEGMENT
BUF DB 50, ?
50 DUP(24H)
CHAR DB 0AH,0DH,"$"
DATA ENDS
CODES SEGMENT
ASSUME CS:
CODES,DS:
DATA
START:
MOV AX,DATA
MOV DS,AX
MOV AH,10
LEA DX,BUF
INT 21H
LEA DX,CHAR
MOV AH,9
INT 21H
LEA DX,BUF+2
MOV AH,9
INT 21H
MOV AH,4CH
INT 21H
四.实验结果(包括必要的截图)
五.实验体会
通过这次实验的练习,我掌握了顺序和循环程序结构和设计方法,并且可以自己动手在debug下运用顺序和循环的程序结构自己设计汇编的代码,另外这节课我还学会了在在屏幕上输入和输出字符串,非常的有趣,顺便我又熟悉了一遍在PC机上建立、汇编、连接、调试和运行8086/8088汇编语言程序的过程,感觉收获颇丰。
挺高了自己对于学习汇编的兴趣。
实验三汇编语言子程序设计(分支、子程序)
一.实验目的
1、掌握分支和子程序结构和设计方法;
2、熟悉在PC机上建立、汇编、连接、调试和运行8086/8088汇编语言程序的过程。
3、通过汇编语言了解高级语言的参数传递等知识。
二.实验内容
1、1.BL中的只有一位为1。
编写程序测试,并输出提示信息“TheXBitis1”,要求:
地址表和转移表。
2.编写一个子程序计算z=f(x,y)=x*y+x-y(x,y,z有符号数内存数)。
要求通过堆栈(寄存器、内存)传送所有参数。
3.实践CAsm的转换过程。
三.实验过程和程序
1.
;实验三第一题
DATASEGMENT
;定义提示信息msg,msgi分别代表第i字节出为1
msg1db'the1bitis1',0dh,0ah,'$'
msg2db'the2bitis1',0dh,0ah,'$'
msg3db'the3bitis1',0dh,0ah,'$'
msg4db'the4bitis1',0dh,0ah,'$'
msg5db'the5bitis1',0dh,0ah,'$'
msg6db'the6bitis1',0dh,0ah,'$'
msg7db'the7bitis1',0dh,0ah,'$'
msg8db'the8bitis1',0dh,0ah,'$'
DATAENDS
STACKSSEGMENT
;未定义栈内容
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATA,SS:
STACKS
START:
MOVAX,DATA
MOVDS,AX
;程序代码部分
xorbx,bx;用异或将bx,dx部分清零
xordx,dx
movbl,08h;将00001000b赋值给bl
movcx,8;利用loop进行8次循环
Lp1:
shrbl,1;将bl进行逻辑右移一次
jcnext;判断CF中数据是否为1,若是跳转到next处
adddx,3;dx加3
loopLp1
next:
movah,09h
leasi,table;将转移表的地址传入到si中
addsi,dx;得到转移表的CF为1的地方
jmpsi
table:
;同一个代码段内使用near跳转
jmpnearptrl1
jmpnearptrl2
jmpnearptrl3
jmpnearptrl4
jmpnearptrl5
jmpnearptrl6
jmpnearptrl7
jmpnearptrl8
;Li:
将msgi的地址传入到dx中,并跳转到done处
l1:
leadx,msg1
jmpdone
l2:
leadx,msg2
jmpdone
l3:
leadx,msg3
jmpdone
l4:
leadx,msg4
jmpdone
l5:
leadx,msg5
jmpdone
l6:
leadx,msg6
jmpdone
l7:
leadx,msg7
jmpdone
l8:
leadx,msg8
jmpdone
;返回汇编窗口
done:
int21h
MOVAH,4CH
INT21H
;代码部分结束
CODESENDS
ENDSTART
2.DATASSEGMENT
xdw6
ydw8
DATASENDS
STACKSSEGMENT
;未定义栈部分
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
;主程序部分
movax,x;分别将x,y压栈
pushax
movax,y
pushax
callf;调用子程序f(x,y)
addsp,4
popax
popax;子程序调用结束,弹栈
MOVAH,4CH
INT21H
;子程序部分
fproc
pushbp
movbp,sp
pushax
pushdx
pushbx
movbx,[bp+4];bx=y
movax,[bp+6];ax=x
imulbx;x*y
addax,[bp+6];x*y+x
adcdx,0
subax,[bp+4];x*y+x-y
sbbdx,0
popbx
popdx
popax
ret
fendp
CODESENDS
ENDSTART
四.实验结果(包括必要的截图)
五.实验体会
通过这次实验的练习,我掌握分支和子程序结构和设计方法,特别是地址表和转移表的运用,已经可以熟练的运用转移表和地址表进行分支结构的设计,实验二又让我对子程序参数的调用有了深刻的体会,知道了在运用堆栈进行参数传递时需要注意的要点,另外这次实验又让我再一次熟悉一遍在PC机上建立、汇编、连接、调试和运行8086/8088汇编语言程序的过程。
实验四汇编语言高级编程专题
一.实验目的
1、汇编语言宏程序设计;
2、掌握中断服务子程序的编写。
3、汇编语言与高级语言的混编。
二.实验内容
1、编写一个宏,求三个数的最小数,原型为:
MIN3x,y,z,min
2、挂接1CH中断,正计时60秒后退出。
要求屏幕显示0-59的秒数。
3、VC++中编写内联汇编,将字节数组的每个元素高低四位互换。
chardbyte[]={0x34,0x45,0x56,0x67,0xaf};
三.实验过程和程序
1;宏min3
min3macrox,y,z
moval,x
movbl,y
movcl,z
cmpal,bl;比较al,bl
jaej1;bljmpj2;否则alj1:
cmpbl,cl;比较bl,cl
jaej3;cljmpj5;否则bl
j2:
cmpal,cl;比较al,cl
jaej3;cljmpj4;否则alj3:
movah,02h;mincl
movdl,cl
ordl,30h
int21h
jmpdone
j4:
movah,02h;minal
movdl,al
ordl,30h
int21h
jmpdone
j5:
movah,02h;minbl
movdl,bl
ordl,30h
int21h
jmpdone
done:
movah,4ch
int21h
endm
DATASSEGMENT
;未定义数据段数据
DATASENDS
STACKSSEGMENT
;未定义栈段数据
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
min32,1,6;找出216三数中最小数
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
2.
DATASEGMENT
OLDISRDW?
?
TIMERDB100
COUNTERDW0
ISDONEDB0
DATAENDS
STACKSSEGMENT
;未定义
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATA,SS:
STACKS
START:
MOVAX,DATA
MOVDS,AX
xorax,ax
MOVES,AX
xorcx,cx
MOVAX,ES:
[1ch*4]
MOVOLDISR[0],AX
MOVAX,ES:
[1ch*4+2]
MOVOLDISR[2],AX
MOVWORDPTRES:
[1ch*4],OFFSETISR
MOVWORDPTRES:
[1ch*4+2],SEGISR
WAITHERE:
CMPISDONE,1
JNZWAITHERE
EXIT:
MOVAX,OLDISR[0]
MOVES:
[1ch*4],AX
MOVAX,OLDISR[2]
MOVES:
[1ch*4+2],AX
MOVAX,4C00H
INT21H
ISRPROCFAR
PUSHDX
PUSHAX
MOVAX,DATA
MOVDS,AX
STI
INCTIMER
AGAIN:
movah,0bh
int21h
oral,al
jzj2
MOVAH,8;不显示输入的字符
INT21H
CMPAL,'a'
JNEj2
MOVAH,2h
MOVDL,10
INT21H
MOVCOUNTER,0
j2:
CMPTIMER,1000/55
JBDONE
MOVTIMER,0
MOVAH,2
MOVDL,13
INT21H
j3:
MOVAX,COUNTER
MOVDL,10
DIVDL
MOVDH,AH
MOVDL,AL
MOVAH,2
ADDDL,30H
INT21H
movah,2
movdl,dh
ADDDL,30H
INT21H
incCOUNTER
cmpCOUNTER,60
JNEDONE
MOVISDONE,1
DONE:
PUSHF
CALLDWORDPTROLDISR
CLI
POPAX
POPDX
IRET;中断返回
ISRENDP
CODESENDS
ENDSTART
3.
#include
usingnamespacestd;
intmain(){
chardbyte[]={0x34,0x45,0x56,0x67,0x67};
__asm{
movesi,0
again:
movcl,4
rordbyte[esi],4
incesi
cmpesi,5
jneagain
}
for(inti=0;i<5;i++)
cout<return0;
}
四.实验结果(包括必要的截图)
五.实验体会
这次实验的练习,使我对汇编语言中宏程序有了一定的了解,并且自己动手编写了宏程序,另外我还掌握了中断服务子程序的编写,感觉非常的复杂,很长时间找不到头绪,最后请教了老师和同学。
在他们的帮助下完成了实验。
虽然花了很久的时间,但是还是非常值得的。