汇编语言实验报告.docx
- 文档编号:6961404
- 上传时间:2023-05-10
- 格式:DOCX
- 页数:21
- 大小:374.21KB
汇编语言实验报告.docx
《汇编语言实验报告.docx》由会员分享,可在线阅读,更多相关《汇编语言实验报告.docx(21页珍藏版)》请在冰点文库上搜索。
汇编语言实验报告
合肥工业大学
计算机与信息学院
实验报告
课程:
汇编语言程序设计
专业班级:
计算机科学与技术09-2班
学号:
20092662
姓名:
张东升
实验一Debug程序的使用
一实验目的
1、熟悉DEBUG程序中的命令,学会在DEBUG下调试运行汇编语言源程序。
2、掌握8086/8088的寻址方式及多字节数据的处理方法。
二实验内容
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
–5、程序未执行前,用“R”命令观察,相关寄存器的内容。
–R↙
如:
(AX)=0000,(BX)=0000,(SI)=0000,
(DI)=0000,(CS)=0c1d,(IP)=0100。
6、在程序未执行前,用“D”命令观察DS:
0200H,DS:
0204H、DS:
0208H单元的内容
–D20020B↙
7、用“G”命令运行源程序
–G=1100116↙
8、再用“D”命令观察DS:
0200H~DS:
020BH字节单元中的内容
–D20020B↙
9、用“T”单步操作命令对源程序单步执行,观察AX、BX、CS、IP寄存器内容的变化,并与预计的结果相比较。
注意:
●D命令显示内存数据,注意观察多字节数据在内存中的存放方式。
●指令执行的时候,IP寄存器随着变化,注意观察。
实验结果分析
1、程序运行结果:
(AX)=0000,(BX)=0000
DS:
0208H四字节单元的内容:
c9740649
2、试用寄存器间接寻址方式编写程序段,完成上述程序段的功能。
(参考下列程序流程图)
三实验过程和程序
按照上述要求在debug中进行数据输入,把结果填在表格中。
四实验结果(包括必要截图)实验截图:
在实验结果看来与理论结果相符
五实验体会
通过老师的认真传授和耐心指导,我终于在重新输入了好多次之后得到了证实的实验结果,debug的使用是一个特别消耗耐心的编程过程,非常容易出现错误,但是只要我们把握住一个耐心的编程思想,多动手多动脑,就会很快熟练这门学科的。
实验二汇编语言程序设计(顺序、循环)
一.实验目的
1、掌握顺序和循环程序结构和设计方法;
2、熟悉在PC机上建立、汇编、连接、调试和运行8086/8088汇编语言程序的过程。
二.实验内容
求一个班10名学生成绩的平均值(最大值和最小值,并将结果显示出来)
三.实验过程和程序
CodeSegment
AssumeCS:
Code,DS:
Code
;-------------------------------------
;功能:
显示指定地址(Str_Addr)的字符串
;入口:
;Str_Addr=字符串地址(要求在数据段)
;用法:
OutputStr_Addr
;用法举例:
OutputPromptStr
OutputMACROStr_Addr
leadx,Str_Addr
movah,9
int21h
EndM
;-------------------------------------
;功能:
输出一个字符
;入口:
dl=要显示的字符
Output_ChrprocNear
pushax
movah,02h
int21h
popax
ret
Output_ChrEndp
;-------------------------------------
;功能:
输出回车换行
Output_CTLFprocNear
pushax
pushdx
movah,02h
movdl,0dh
int21h
movdl,0ah
int21h
popdx
popax
ret
Output_CTLFEndp
;-------------------------------------
;功能:
把AX中的二进制无符号数转换成显式的十进制ASCII码,并送显示屏显示
;入口:
AX=二进制数
;出口:
在当前光标位置显示转换后的ASCII码数字
Dec_ASCIIProcNear
pushds
pushcs
popds
pushcs
popes
pushdx
pushbx
pushdi
movbx,10
leadi,@@Temp_Save[6]
movBYTEptr[di],'$'
decdi
cld
@@Divide:
xordx,dx
divbx
ordl,30h
mov[di],dl
decdi
testax,0ffffh
jnz@@Divide
incdi
pushdi
popdx
movah,9
int21h
popdi
popbx
popdx
popds
ret
@@Temp_Savedb7dup(?
)
Dec_ASCIIEndP
;-------------------------------------
;功能:
把AL中的二进制无符号数作为小数转换成显式的十进制ASCII码,
;并送显示屏显示,未考虑四舍五入
;入口:
AH=二进制数,BH=除数,CX=保留小数位数
;出口:
在当前光标位置显示转换后的ASCII码数字
Dec_FracProcNear
pushax
movdl,'.'
callOutput_Chr;显示一个小数点
popax
movbl,10;乘数
@@Dec_Frac:
moval,ah;余数不为0,处理小数部分
mulbl;余数乘10,继续做除法
divbh;除以除数,取商数作为结果的一位小数
oral,30h
movdl,al
callOutput_Chr;显示一位小数
loop@@Dec_Frac
ret
Dec_FracEndP
;-------------------------------------
SCOREdb56,69,84,82,73,88,99,63,100,80;成绩单
Elementsequ($-SCORE)/TypeSCORE;元素个数
RESULTdb6dup(0);各分数段计数
SUMdw0;总分
AVERdb?
;平均分
prompt_Resdb'00---59:
$'
prompt_Avedb13,10,'Average:
$';提示显示平均分
Press_Keydb13,10,13,10,'Thecomplated.Pressanykeytoexit...$'
Start:
pushcs
popds
pushcs
popes;使数据段、附加段与代码段同段
;-------------------------------------
;统计低于60分、60-69、70-79、80-89、90-100各分数段人数并显示
leasi,SCORE;成绩首地址
movcx,Elements;成绩数目
movdl,10;用于除10
cld
@@Statics:
lodsb;提取成绩
xorah,ah
addSUM,ax;累计总分
divdl;除10
cmpal,5;>5,及格
jg$+4
moval,5;<=5,不及格
subal,5;减5,分数段计数地址偏移量
cbw;
pushax
popbx
incRESULT[bx];计数增1
loop@@Statics;循环,统计下一个成绩
moval,RESULT[5];取100分人数
addRESULT[4],al;加到90-100分数段
movbl,59h
movcx,5
leasi,RESULT;各分数段计数数组首地址
leadx,prompt_Res;统计结果字符串地址
List_Res:
movah,9;显示分数段提示信息
int21h
lodsb;读入计数值
xorah,ah
callDec_ASCII;显示统计结果
callOutput_CTLF;输出一个回车、换行
moval,bl
incal
daa
movbl,al
pushcx
movcl,4
xorah,ah
shlax,cl
shral,cl
orax,3030h
xchgah,al
movWORDptrPrompt_Res,ax
moval,bl
addal,9
movbl,al
xorah,ah
shlax,cl
shral,cl
orax,3030h
xchgah,al
movWORDptrPrompt_Res[5],ax
popcx
loopList_Res
;-------------------------------------
;计算并显示平均分
Outputprompt_Ave;提示显示平均分
movbl,Elements
movax,SUM;取总分
divbl;平均分取整数部分
movAVER,al;保存平均分
xorah,ah
callDec_ASCII;显示平均分
Exit_Proc:
leadx,Press_Key;提示操作完成,按任意键结束程序
movah,9
int21h
movah,1
int21h
movah,4ch;结束程序
int21h
CodeENDS
ENDStart;编译到此结束
四.实验结果(包括必要的截图)
五,实验体会
本次试验应用到的知识比较多,程序比较复杂,代码段比较长,但是在熟悉设计思路之后,费点功夫还是可以设计出来的,通过本次试验,我知道明白了汇编语言的高效性和复杂性,并且初步具备了简单的编程能力。
实验三汇编语言子程序设计(分支、子程序)
一.实验目的
1、掌握分支和子程序结构和设计方法;
2、熟悉在PC机上建立、汇编、连接、调试和运行8086/8088汇编语言程序的过程。
3、通过汇编语言了解高级语言的参数传递等知识。
二.实验内容
完成Word型二进制,十进制和十六进制的相互转换,包括从键盘输入和屏幕输出功能。
要求:
1.功能选择。
2.转换使用子程序实现,且:
二进制到十进制和十六进制转换使用内存传递参数;十进制到二进制和十六进制转换使用寄存器传递参数;十六进制到二进制和十进制转换使用堆栈传递参数。
3.输出使用子程序实现。
三.实验过程和程序
datasegment
bufferdb6,?
6dup(?
)
mess1db0ah,0dh,"Inputanumberplease:
$"
mess2db0ah,0dh,"Thebytenumberis:
$"
mess3db0ah,0dh,"Thedecadenumberis:
$"
mess4db0ah,0dh,"Thehexdecimalnumberis:
$"
hextabdb"0123456789abcdef"
c10dw10
xdw?
dataends
;---------------------------------------------------------
codesegment
assumecs:
code,ds:
data
;---------------------------------------------------------
start:
movax,data
movds,ax
leadx,mess1
movah,9
int21h
leadx,buffer
movah,0ah
int21h
;输入一个十进制数
movcl,buffer+1
movch,0
leabx,buffer+2
movax,0
one:
mulc10
movdl,[bx]
anddl,0fh
addal,dl
adcah,0
incbx
loopone
movx,ax
movsi,ax;把二进制数送给si,作十六进制转换
leadx,mess2
movah,9
int21h
movcl,10h
bit:
shlx,1
jctwo
movbl,'0'
jmpthree
two:
movbl,'1'
three:
movdl,bl
movah,02h
int21h
;输出二进制
loopbit
;--------------------------------------------------
movcl,buffer+1
leadx,mess3
movah,9
int21h
leabx,buffer+2
decs:
movdl,[bx]
movah,02h
int21h
incbx
loopdecs
;--------------------------------------------------
leadx,mess4
movah,9
int21h
movcx,4
leabx,hextab
hex:
pushcx
movcl,4
rolsi,cl
movax,si
andax,000fh
xlat
movdl,al
movah,2
int21h
popcx
loophex
movax,4c00h
int21h
;---------------------------------------------------
codeends
endstart
四.实验结果(包括必要的截图)
五.实验体会
本次试验重点难点在与子程序的管理和调用,这道题是汇编语言之中的一道经典题,数制转换核心在于一个转换思想,这个思想可以应用到很多方面,通过本次试验熟练了各种小程序的使用和各种指令的运用,虽然当时遇到了很多麻烦,但是最终还是把结果显示出来了,我以后一定要多加练习编程,提高自己的逻辑思维能力。
实验四汇编语言高级编程专题
一.实验目的
1、汇编语言宏程序设计;
2、掌握中断服务子程序的编写。
3、汇编语言与高级语言的混编。
二.实验内容
1、编写一个宏,求三个数的最小数,原型为:
MIN3x,y,z,mix
2、挂接1CH中断,正计时60秒后退出。
要求屏幕显示0-59的秒数。
三.实验过程和程序
1.Minmacrox,y,z
localContinue,Change,Change2,Down
pushax
pushdx
moval,x
cmpal,y
jgChange
Continue:
cmpal,z
jgChange2
jmpDown
Change:
moval,y
jmpContinue
Change2:
moval,z
Down:
movdl,al
movah,2
int21h
popdx
popax
endm
dsegsegment
msgdb0dh,0ah,'pleaseinputnum:
$'
msg2db0dh,0ah,'theminnumis:
$'
p1db?
p2db?
p3db?
dsegends
csegsegment
assumecs:
cseg,ds:
dseg
Start:
movax,dseg
movds,ax
movdx,offsetmsg
movah,9
int21h
movah,1
int21h
movp1,al
movah,9
int21h
movah,1
int21h
movp2,al
movah,9
int21h
movah,1
int21h
movp3,al
movdx,offsetmsg2
movah,9
int21h
Minp1,p2,p3
movah,4ch
int21h
csegends
endStart
2:
IntNoequ1ch
Tlenequ59
dsegsegment
Counterdw0
Timerdw0
IsDonedb0
CR=0dh
LF=0ah
MsgdbCR,LF,'$'
dsegends
csegsegment
assumecs:
cseg,ds:
dseg
OldInt1Cdd?
Mainproc
movax,dseg
movds,ax
movax,0
moves,ax
movax,es:
[IntNo*4]
movwordptrcs:
OldInt1C,ax
movax,es:
[IntNo*4+2]
movwordptrcs:
OldInt1C+2,ax
cli
movwordptres:
[IntNo*4],offsetTimerISR
moves:
[IntNo*4+2],cs
sti
Waiter:
cmpIsDone,1
jnzWaiter
cli
movax,wordptrcs:
OldInt1C
moves:
[IntNo*4],ax
movax,wordptrcs:
OldInt1C+2
moves:
[IntNo*4+2],ax
sti
movax,4c00h
int21h
Mainendp
TimerISRprocfar
sti
pushds
pushax
movax,dseg
movds,ax
addTimer,55
cmpTimer,1000
jbDone
movTimer,0
movah,2
movdl,13
int21h
movax,Counter
movdl,10
divdl
movdh,ah
movdl,al
adddl,30h
movah,2
int21h
movdl,dh
adddl,30h
movah,2h
int21h
incCounter
movah,0bh
int21h
oral,al
jnzCharReady
skip:
cmpCounter,60
jbDone
movIsDone,1
jmpDone
CharReady:
movah,1
int21h
cmpal,61h
jneskip
leadx,Msg
movah,09h
int21h
movCounter,0
Done:
pushf
calldwordptrOldInt1C
cli
popax
popds
iret
TimerISRendp
csegends
endMain
四.实验结果(包括必要的截图)
五.实验体会
通过本次试验,我对汇编语言的了解更加深入了一步,并掌握了一定的编程技巧,宏是汇编编程当中的比较重要的一部分,学习和使用之后为我们以后深入汇编语言打下了良好的基础。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 实验 报告