汇编语言程序设计实验报告.docx
《汇编语言程序设计实验报告.docx》由会员分享,可在线阅读,更多相关《汇编语言程序设计实验报告.docx(20页珍藏版)》请在冰豆网上搜索。
汇编语言程序设计实验报告
《汇编语言程序设计》实验报告
实验室:
S318
最后一次实验时间:
2010年5月18日
第12周星期二1-2节
学院:
计算机科学与技术学院
专业:
计算机科学与技术
实验一
实验题目:
认识Tddebug集成环境
实验目的:
1.熟悉汇编程序的开发过程。
2.认识Tddebug集成操作软件。
3.掌握在Tddebug集成环境中编辑、编译、连接汇编语言程序方法。
4.掌握INT21H软件中断来调用DOS内部子程序的方法
实验主要步骤:
1.运行Tddebug软件,选择Edit菜单编写实验程序
2.使用Compile菜单中的Compile和Link对实验程序进行汇编、连接,生成执行文件。
3.使用Rmrun菜单中的Run运行程序,观察运行结果。
4.使用Rmrun菜单中的Debug调试程序,查看程序段、数据段、附加段装入内存后的分配情况。
单步执行数据传送指令后,观察各寄存器及数据区的内容。
过程如下:
1)按F7单步执行,在代码区中有一个三角,表示正在执行的指令。
每一条指令的执行一定会使目标寄存器和状态寄存器发生变化,从相关窗口看结果。
2)检查内存数据区的内容,关键是找出用户程序的数据段和附加段:
●方法1:
在CPU窗口按Tab键使内存数据显示区成为活动区,按Ctrl+G键,输入:
“DS或ES寄存器的值:
偏移地址”,即可显示用户指定的数据区
●方法2:
选择菜单View|Dump,弹出内存数据显示窗口。
3)查看执行结果:
按Alt+F5,切换到用户窗口。
5.更改数据区中的数据,考察、调试程序的正确性。
6.程序代码:
;数据传送实验,采用相对寻址方式
DDATASEGMENT;定义源数据段
MSRDB"HELLO,WORLD!
$"
LENEQU$-MSR
DDATAENDS
EXDASEGMENT;定义附加数据段
MSDDBLENDUP(?
)
EXDAENDS
MYSTACKSEGMENTSTACK;定义堆栈段
DW20DUP(?
)
MYSTACKENDS
CODESEGMENT;定义代码段
ASSUMECS:
CODE,DS:
DDATA,ES:
EXDA
START:
MOVAX,DDATA
MOVDS,AX;装载数据段寄存器
MOVAX,EXDA
MOVES,AX;装载附加数据段寄存器
MOVSI,OFFSETMSR
MOVDI,OFFSETMSD
MOVCX,LEN
MOVBX,0
NEXT:
MOVAL,MSR[BX];开始传输数据
MOVES:
MSD[BX],AL
INCBX
LOOPNEXT
PUSHES
POPDS;将附加段寄存器指向的段值赋给数据段寄存器
MOVDX,OFFSETMSD
MOVAH,9
INT21H;显示字符串
MOVAH,4CH
INT21H;返回DOS状态
CODEENDS
ENDSTART
实验结果:
通过Tddebug软件写好实验程序后,对程序进行编译连接,最终生成执行文件,在dos环境下启动后,进入Tddebug,对程序进行单步执行,可看到在每一步执行过程中,程序所分得的地址单元。
连接试验箱后,通过对试验箱的操作,能够看到在dos环境下程序的执行步骤。
代码运行结果:
显示:
“HELLO,WORLD!
”
心得体会:
通过本次试验,是我回顾了在学习单片机的时候使用的Tddebug集成开发软件使用方法,了解了汇编程序的开发过程。
能够在Tddebug环境下进行编辑、编译、连接程序,掌握了INT21H软件中断的调用DOS内部子程序的方法。
但对于DOS环境下的汇编程序的编辑、编译、连接使用还不是很熟悉,只能是Tddebug集成软件开发环境下熟悉的编译连接运行。
实验二
实验名称:
I/O程序设计
实验目的:
1.理解软中断的调用方法及中断过程。
2.掌握INT21H软件中断来调用DOS系统I/O子程序的方法。
3.掌握将存储在内存单元中的数据在屏幕上显示的方法。
4.掌握从键盘输入信息到内存的方法。
实验内容:
1.将指定数据区中一个字节的数据以十六进制数形式显示在屏幕上。
2.编程由键盘输入任意一个字符,将该字符的ASCII码值显示在屏幕上。
3.从键盘输入两个1位十进制数,计算二者之和,并将结果显示在屏幕上。
4.编程由键盘输入任意一位数,将该数以二进制数形式显示在屏幕上
实验步骤:
1.画出实验流程图。
2.运行Tddebug软件,选择Edit菜单编写实验程序
3.使用Compile菜单中的Compile和Link对实验程序进行汇编、连接,生成执行文件。
4.使用Rmrun菜单中的Run运行程序,观察运行结果。
5.使用Rmrun菜单中的Debug调试程序。
单步执行指令,观察各寄存器及数据区的内容。
更改数据区中的数据,考察程序的正确性
实验代码:
DATASEGMENT
MESDB'Showaashex:
',0AH,0DH,'$'
SDDB'a'
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVDX,OFFSETMES;显示提示信息
MOVAH,09H
INT21H
MOVSI,OFFSETSD
MOVAL,DS:
[SI]
ANDAL,0F0H;取高4位
MOVCL,4
SHRAL,CL
CMPAL,0AH;是否是A以上的数
JBC2
ADDAL,07H
C2:
ADDAL,30H
MOVDL,AL;显示字符
MOVAH,02H
INT21H
MOVAL,DS:
[SI]
ANDAL,0FH;取低4位
CMPAL,0AH
JBC3
ADDAL,07H
C3:
ADDAL,30H
MOVDL,AL;显示字符
MOVAH,02H
INT21H
MOVAH,4CH;返回DOS
INT21H
CODEENDS
ENDSTART
实验结果:
代码运行结果:
显示“61H”
心得体会:
本次实验要求我们将指定数据区的一个数据转换为其十六进制数,通过这次实验,我充分理解了什么是软中断,以及软中断的调用方法和中断过程,并了解了INT21H软中断来调用DOS系统I/O子程序的方法,并知道如何将存储在内存单元中的素具显示在屏幕上。
在老师的讲解过程中,我对试验提供的参考代码有了更深的了解,明白了如何进行调用软中断。
实验三
实验名称:
代码转换程序设计
实验目的:
1.了解微机中所使用的各类数制及编码方法。
2.掌握不同进制数及编码相互转换的程序设计方法,加深对数码转换的理解。
3.掌握将存储在内存单元中的数据以十六进制数形式、十进制数形式和二进制数形式显示在屏幕上的方法。
实验内容:
1.将5位十进制数的数字串转换为一个字的二进制数
2.编写程序将内存中一个字的数转换为十进制数的数字串显示。
((压栈或者字符串)
3.编程将十进制的数字串转换为BCD码
4.编程将BCD码转换为二进制数
5.编程将二进制数转换为十进制数显示
实验步骤:
1.画出实验流程图。
2.运行Tddebug软件,选择Edit菜单编写实验程序
3.使用Compile菜单中的Compile和Link对实验程序进行汇编、连接,生成执行文件。
4.使用Rmrun菜单中的Run运行程序,观察运行结果。
5.使用Rmrun菜单中的Debug调试程序。
单步执行指令,观察各寄存器及数据区的内容。
6.更改数据区中的数据,考察程序的正确性。
实验流程图:
图6-2将5位十进制数的数字串转换为二进制数参考流程
图6-3将十进制数的数字串转换为BCD码参考流程
代码:
DDATASEGMENT
MESDB'Theasciicodeofdecimalcodeare:
$'
BUFDB30H,30H,30H,31H,32H;十进制00012的ASCII码
DB10HDUP(0)
DDATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DDATA
START:
MOVAX,DDATA
MOVDS,AX
MOVSI,OFFSETBUF
MOVBL,0AH;送乘数
MOVCX,0004H;送转换位数
MOVAH,00H
MOVAL,[SI];取第一位ASCII码
SUBAL,30H
A1:
INCSI
IMULBL;乘10(AL*BL)放在AX中
ADDAL,[SI]
SUBAL,30H
LOOPA1
MOVBX,AX
MOVDX,OFFSETMES;显示提示信息
MOVAH,09H
INT21H
MOVAX,BX;显示结果
MOVCX,4
A3:
PUSHCX
MOVCL,4
ROLAX,CL;向左移位
POPCX
MOVBX,AX
ANDAL,0FH;高4位清零,保留低4位的值
CMPAL,0AH
JBA2
ADDAL,07H
A2:
ADDAL,30H
MOVDL,AL
MOVAH,02H
INT21H
MOVAX,BX
LOOPA3
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
实验结果:
代码运行结果:
显示“00001010”
心得体会:
本次实验要求我们将5位十进制数的数字串转换为一个字的二进制数,通过这次实验,我了解了微机中所使用的各类数制及编码方法,并知道了不同进制数及编码相互转换的程序设计方法,加深了对数码转换的理解,并掌握了将存储在内存单元中的数据以十六进制数形式显示在屏幕上的方法。
在刚开始实验的时候对于将十进制数转换为二进制有点不知道怎么办,虽然知道应该怎么算,但是却不知道怎么样写代码,通过对参考代码的理解,对于将十进制转换为二进制有了一定的概念,知道了要写一个转换进制的实验的基本步骤了。
对上述实验我进行了一定的修改,代码如下:
datasegment
bufdb6,6dup(0)
msg1db'PleaseinputX:
',0ah,0dh,'$'
msg2db0ah,0dh,'PleaseinputP:
',0ah,0dh,'$'
msg3db0ah,0dh,'Result:
',0ah,0dh,'$'
dataends
codesegment
assumecs:
code,ds:
data
;将字符串转换为十进制数的子程序
;输入参数:
字符处首地址
;输出参数:
ax(保存十进制数)
StrToNumproc
pushbx
movbx,10
StrToNum_s1:
mulbx
andbuf[si],0fh
addal,buf[si]
incsi
loopStrToNum_s1
popbx
ret
StrToNumendp
;功能:
输出P进制数子程序
;输入参数:
ax
;输出参数:
无
Printproc
pushax
pushbx
pushcx
pushdx;保护
xorcx,cx
s1:
movdx,0
divbx
pushdx
inccx
cmpax,0
jnes1
movah,02h
s2:
popdx
adddl,30h
cmpdl,39h
jas1
int21h
loops2
jmpok
adddl,7h
int21h
loops2
ok:
popdx
popcx
popbx
popax
ret
Printendp
start:
movax,data
movds,ax
movdx,offsetmsg1;输出msg1
movah,09h
int21h
movdx,offsetbuf;输入十进制数X
movah,0ah
int21h
movcl,buf[1]
movsi,2
movax,0
callStrToNum;调用将字符串转换为十进制
pushax;暂存ax
movdx,offsetmsg2;输出msg2
movah,09h
int21h
movdx,offsetbuf;输入p
movah,0ah
int21h
movcl,buf[1]
movsi,2
movax,0
callStrToNum;调用将字符串转换为十进制
movbx,ax
movdx,offsetmsg3;输出msg3
movah,09h
int21h
popax
callPrint
movax,4c00hint21h
codeends
endstart
运行结果如下:
PleaseinputX:
//输入一个数
9
PleaseinputP:
//选择显示输出结果的进制数
2
Result:
1001
实验四
实验名称:
综合程序设计
实验目的:
掌握子程序的写法、循环的调用,利用汇编语言编写简单的程序。
实验内容:
编程由键盘输入任意一位数,将该数以二进制数形式显示在屏幕上
要求:
含有子程序,循环
实验步骤:
1.画出实验流程图。
2.运行Tddebug软件,选择Edit菜单编写实验程序
3.使用Compile菜单中的Compile和Link对实验程序进行汇编、连接,生成执行文件。
4.使用Rmrun菜单中的Run运行程序,观察运行结果。
5.使用Rmrun菜单中的Debug调试程序。
实验流程图:
实验代码:
;输入一个数,选择显示进制,并在屏幕上显示出来
datasegment
bufdb?
msg1db'PleaseinputX:
',0ah,0dh,'$'
msg2db0ah,0dh,'Result:
',0ah,0dh,'$'
dataends
codesegment
assumecs:
code,ds:
data
d_to_bprocnear
movbuf,2
movcx,8
moval,buf
ed:
clc
rclbyteptrbuf,1
jncone
movah,02h
movdl,'1'
int21h
jmpll
one:
movah,02h
movdl,'0'
int21h
ll:
looped
ret
d_to_bendp
start:
movax,data
movds,ax
movdx,offsetmsg1;输出msg1
movah,09h
int21h
movah,01h
int21h
movbuf,al
movdx,offsetmsg2;输出msg2
movah,09h
int21h
calld_to_b
movax,4c00h;返回
int21h
codeends
endstart
实验结果:
代码运行结果:
PleaseinputX:
6
Result:
00000110
心得体会:
本次实验是一个综合性实验的设计,在本次实验中,要求我们编写一个程序,实现从键盘任意输入一位数,将该数以二进制形式显示在屏幕上,并且在程序中必须包括子程序及循环。
在做这个题目的过程中,遇到了很多问题,刚开始的时候是使用clc清零CF标志位,但是最终的到的结果是,无论输入什么数,都是00000000,最后经过和同学讨论,猜得到最后的正确结果,不是clc的问题而是需要把后面的一句改成“rclbyteptrbuf,1”,最后算是水里完成呢个了本次试验。
通过这次实验,我对于汇编语言有了更深的了解,并学会了如何用汇编进行简单程序的编写。