合肥工业大学汇编实验报告.docx
《合肥工业大学汇编实验报告.docx》由会员分享,可在线阅读,更多相关《合肥工业大学汇编实验报告.docx(32页珍藏版)》请在冰豆网上搜索。
合肥工业大学汇编实验报告
合肥工业大学
计算机与信息学院
实验报告
课程:
汇编语言程序设计
专业班级:
计算机科学与技术
学号:
姓名:
实验一Debug程序的使用
一.实验目的
1、熟悉DEBUG程序中的命令,学会在DEBUG下调试运行汇编语言源程序。
2、掌握8086/8088的寻址方式及多字节数据的处理方法。
二.实验内容
1、利用DEBUG程序中的“E”命令,将两个多字节数“003F1AE7H”和“006BE5C4H”分别送入起始地址为DS:
0200H和DS:
0204H两个单元中。
2、分别用直接寻址方式和寄存器间接寻址方式编写程序段,实现将DS:
0200H单元和DS:
0204H单元中的数据相加,并将运算结果存放在DS:
0208H单元中。
要求:
本次实验的内容均在DEBUG下完成,实现数据的装入、修改、显示;汇编语言程序段的编辑、汇编和反汇编;程序的运行和结果检查。
三.实验过程和程序
1、启动DOS操作系统
2、运行DEBUG.COM程序(若当前盘为C)
C:
>DEBUG↙
–;(“–”为DEBUG提示符,仅当屏幕出现该提示符后,才可输入DEBUG命令)
4、用“A”命令编辑和汇编源程序
–A↙
186E:
0100MOVAX,[0200]↙
186E:
0103MOVBX,[0202]↙
186E:
0107ADDAX,[0204]↙
186E:
010BADCBX,[0206]↙
186E:
010FMOV[0208],AX↙
186E:
0112MOV[020A],BX↙
186E:
0116↙
5、用“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
–
6、程序未执行前,用“R”命令观察,相关寄存器的内容。
–R↙
如:
(AX)=,(BX)=,(SI)=,
(DI)=,(CS)=,(IP)=。
7、在程序未执行前,用“D”命令观察DS:
0200H,DS:
0204H、DS:
0208H单元的内容
–D20020B↙
8、用“G”命令运行源程序
–G=1000116↙
9、再用“D”命令观察DS:
0200H~DS:
020BH字节单元中的内容
–D20020B↙
10、用“T”单步操作命令对源程序单步执行,观察AX、BX、CS、IP寄存器内容的变化,并与预计的结果相比较。
四.实验结果(包括必要的截图)
验体会
这次的实验让我学会了dos模式下的debug使用,学会了d,r,g,t命令的使用,我觉得尤其是t命令,让我了解了汇编语言,单步执行的使用方法,深刻的理解了汇编语言每一句对寄存器的改变,加深了上课的理解
实验二汇编语言程序设计(顺序、循环)
一.实验目的
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
Ydw720
Zdw-1
Vdw1
Sum1dw?
Sum2dw?
Dataends
Codesegment
Assumecs:
codeds:
data
Start:
movax,data
Movds,ax
Movax,x;x*y
Movbx,y
Imulbx
Movcx,ax;x*y+z
Movbx,dx
Movax,z
Cwd
Addcx,ax
Adcbx,dx
Subcx,720;x*y+z-720
Sbbbx,0
Movax,v;v-(x*y+z-720)
Cwd
Subax,cx
Sbbdx,bx
Movbx,x;(v-(x*y+z-720))/x
Idivbx
Movsum1,ax;sum1存商,sum2存余数
Movsum2,dx
movbx,sum1
movch,4
movcl,4
again:
rolbx,cl
movdl,bl
anddl,0fh
cmpdl,0ah
jlnext
adddl,37h;"A"-"F"
jmpdown
next:
adddl,30h;"0"-"9"
down:
movah,2
int21h
decch
jnzagain
movdl,23h;"#"
movah,2
int21h
movbx,sum2
movch,4
movcl,4
again1:
rolbx,cl
movdl,bl
anddl,0fh
cmpdl,0ah
jlnext1
adddl,37h;"A"-"F"
jmpdown1
next1:
adddl,30h;"0"-"9"
down1:
movah,2
int21h
decch
jnzagain1
Movax,4c00h
Int21h
Codeends
Endstart
2.
datasegment
gradedb61,73,82,90,100,45dup(70)
avg1db?
;平均值的商
avg2db?
;平均值的余数
maxdb?
;最大值
mindb?
;最小值
dataends
codesegment
assumecs:
code,ds:
data
start:
movax,data
movds,ax
movsi,0
movbx,0
movcx,50
movax,0
l1:
moval,grade[si]
cbw
addbx,ax
incsi
loopl1
movax,bx
movbl,50
divbl
movavg1,al
movavg2,ah
movsi,0;找最大值
movcx,50
moval,grade[0]
again0:
cmpal,grade[si]
janext0
moval,grade[si]
next0:
incsi
loopagain0
movmax,al
movsi,0;找最小值
movcx,50
moval,grade[0]
again1:
cmpal,grade[si]
jnanext1
moval,grade[si]
next1:
incsi
loopagain1
movmin,al
movbl,avg1;平均值的商
callsub
movdl,23h;"#"分开不同数据
movah,2
int21h
movbl,avg2;平均值的余数
callsub
movdl,23h;"#"分开不同数据
movah,2
int21h
movbl,max;最大值
callsub
movdl,23h;"#"分开不同数据
movah,2
int21h
movbl,min;最小值
callsub
movax,4c00h
int21h
subproc
movch,2
movcl,4
again2:
rolbl,cl
moval,bl
andal,0fh
cmpal,0ah
jlnext2
addal,37h;"A"-"F"
jmpdown1
next2:
addal,30h;"0"-"9"
down1:
movdl,al
movah,2
int21h
decch
jnzagain2
ret
subendp
codeends
endstart
3.
datasegment
bufdb50;定义缓冲区
db40
db40dup(0)
crlfdb0dh,0ah,'$';回车换行
dataends
stacksegmentstack
db100dup(0)
stackends
codesegment
assumeds:
data,ss:
stack,cs:
code
start:
movax,data
movds,ax
leadx,buf;输入字符串
movah,10
int21h
leadx,crlf;输出换行
movah,9
int21h
movbl,buf+1
movbh,0;计算字符串实际字符个数
movbyteptrbuf+2[bx],'$';在串尾补入'$'
leadx,buf+2
movah,9;输出字符串
int21h
movah,4ch
int21h
codeends
endstart
在这一次的实验中输出数字,需要加上30h或者37h输出才能输出实际的数字,就是在代码中用ASCII码表示,这个考试的时候忘记了,结果也没有想起来,考试的时候错了,还有就是固定格式的cs:
codeds:
datacs平时直接复制的考试的时候写成了es,真是有点遗憾。
实验三汇编语言子程序设计(分支、子程序)
一.实验目的
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
S1DB'The1Bitis1$'
S2DB'The2Bitis1$'
S3DB'The3Bitis1$'
S4DB'The4Bitis1$'
S5DB'The5Bitis1$'
S6DB'The6Bitis1$'
S7DB'The7Bitis1$'
S8DB'The8Bitis1$'
Dataends
codesegment
assumecs:
code,ds:
data
start:
movax,data
movds,ax
movdx,0
;-------输入BL--------
MOVBL,00001000B
MOVAL,BL
;------循环开始--------
MOVCX,8
GOGO:
SHLAL,1
;-------跳转-------------
JCEXIT
adddx,3
LOOPGOGO
;************************
EXIT:
MOVAH,9
LEASI,JMPTABLE
ADDSI,DX
JMPSI
JMPTABLE:
JMPNEARPTRL1
JMPNEARPTRL2
JMPNEARPTRL3
JMPNEARPTRL4
JMPNEARPTRL5
JMPNEARPTRL6
JMPNEARPTRL7
JMPNEARPTRL8
L1:
LEADX,S1
JMPDONE
L2:
LEADX,S2
JMPDONE
L3:
LEADX,S3
JMPDONE
L4:
LEADX,S4
JMPDONE
L5:
LEADX,S5
JMPDONE
L6:
LEADX,S6
JMPDONE
L7:
LEADX,S7
JMPDONE
L8:
LEADX,S8
DONE:
INT21H
movah,4ch
int21h
codeends
endstart
2.
;堆栈传递
Stacksegment
dw512dup(?
)
Stackends
Datasegment
xdw4
ydw4
zdw?
Dataends
Codesegment
assumecs:
code,ds:
data,ss:
stack
start:
movax,data
movds,ax
subsp,2
movax,x
pushax
movax,y
pushax
callP1
popz
movax,z
movbx,ax
movdx,0
movch,4
movcl,4
again:
rolbx,cl
moval,bl
andal,0fh
cmpal,0ah
jlnext
addal,37h
jmpdown
next:
addal,30h
down:
movdl,al
movah,2
int21h
decch
jnzagain
movah,4ch
int21h
P1procnear
pushbp
movbp,sp
pushax
pushbx
pushcx
pushdx
movax,6[bp];x的值
movbx,4[bp];y的值
imulbx;x*y
movcx,dx;x*y+x
movbx,ax
movax,6[bp]
cwd
addbx,ax
adccx,dx
movax,4[bp];x*y+x-y
cwd
subbx,ax
sbbcx,dx
mov8[bp],bx
popdx
popcx
popbx
popax
popbp
ret4
P1endp
Codeends
endstart
寄存器传递
Stacksegment
dw512dup(?
)
Stackends
Datasegment
xdw4
ydw4
zdw?
Dataends
Codesegment
assumecs:
code,ds:
data,ss:
stack
start:
movax,data
movds,ax
movax,x
movbx,y
callP1
movz,bx;bx做出口参数
movbx,z;方便查看输出是否正确
movdx,0
movch,4
movcl,4
again:
rolbx,cl
moval,bl
andal,0fh
cmpal,0ah
jlnext
addal,37h
jmpdown
next:
addal,30h
down:
movdl,al
movah,2
int21h
decch
jnzagain
movah,4ch
int21h
P1procnear
pushax
pushcx
imulbx
movcx,dx
movbx,ax
movax,x
cwd
addbx,ax
adccx,dx
movax,y
cwd
subbx,ax
sbbcx,dx
popcx
popax
ret
P1endp
Codeends
endstart
四.实验体会
在这一次的实验中的实验二的堆栈传递方式,让我很有体会,感觉和c语言中的函数相似度极高,通过自己的调试,进一步了解到了堆栈传递的细节,尤其是堆栈传递中的地址的变化,让自己体会深刻。
实验四汇编语言高级编程专题
一.实验目的
1、汇编语言宏程序设计;
2、掌握中断服务子程序的编写。
3、汇编语言与高级语言的混编。
二.实验内容
1、编写一个宏,求三个数的最小数,原型为:
MIN3x,y,z,min
2、挂接1CH中断,正计时60秒后退出。
要求屏幕显示0-59的秒数。
3、VC++中编写内联汇编,将字节数组的每个元素高低四位互换。
chardbyte[]={0x34,0x45,0x56,0x67,0xaf};
三.实验过程和程序
1.
MIN3macrox,y,z,min
movax,x
cmpax,y
jlnext0
movax,y
next0:
cmpax,z
jldown0
movax,z
down0:
movmin,ax
endm
datasegment
xdw13
ydw15
zdw16
mindw?
dataends
codesegment
assumecs:
code,ds:
data
start:
movax,data
movds,ax
MIN3x,y,z,min
movbx,min
movch,4
movcl,4
again:
rolbx,cl
moval,bl
andal,0fh
cmpal,0ah
jlnext
addal,37h;"A"-"F"
jmpdown
next:
addal,30h;"0"-"9"
down:
movdl,al
movah,2
int21h
decch
jnzagain
movah,4ch
int21h
codeends
endstart
2.
;汇编挂接1CH中断,正计时60秒后退出
DATASEGMENT
OLDISRDW?
?
TIMERDB100
COUNTERDW0
ISDONEDB0
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVAX,0
MOVES,AX
CLI
MOVAX,ES:
[1CH*4];保存原中断向量
MOVOLDISR[0],AX
MOVAX,ES:
[1CH*4+2]
MOVOLDISR[2],AX
MOVWORDPTRES:
[1CH*4],OFFSETISR;设置新中断向量
MOVWORDPTRES:
[1CH*4+2],SEGISR
STI
DELAY:
CMPISDONE,1
JNZDELAY
CLI
MOVAX,OLDISR[0];恢复原中断向量
MOVES:
[1CH*4],AX
MOVAX,OLDISR[2]
MOVES:
[1CH*4+2],AX
STI
MOVAH,4CH
INT21H
ISRPROCFAR
PUSHDX
PUSHAX
MOVAX,DATA
MOVDS,AX
STI
INCTIMER;执行新中断处理
CMPTIMER,1000/55
JBDONE
MOVTIMER,0
MOVAH,2
MOVDL,0DH
INT21H
MOVAX,COUNTER;打印时间
MOVDL,10
DIVDL
MOVDH,AH
MOVDL,AL
MOVAH,2
ADDDL,30H
INT21H
MOVDL,DH
ADDDL,30H
INT21H
INCCOUNTER
CMPCOUNTER,60
JLDONE
MOVISDONE,1
DONE:
PUSHF
CALLDWORDPTROLDISR;调用原中断处理
CLI
POPAX
POPDX
IRET;中断返回
ISRENDP
CODEENDS
ENDSTART
3.
#include
#include
usingnamespacestd;
voidmain()
{unsignedchardbyte[]={0x34,0x45,0x56,0x67,0xaf};
_asm
{
movch,5
movesi,0
movcl,4
do:
rordbyte[esi],cl
incesi
decch
jnzdo
}
cout<:
uppercase)<