汇编上机实验报告.docx
《汇编上机实验报告.docx》由会员分享,可在线阅读,更多相关《汇编上机实验报告.docx(29页珍藏版)》请在冰豆网上搜索。
汇编上机实验报告
实验一认识Tddebug集成操作软件实验日志
指导教师曾素华实验时间:
2013年04月02日
学院计算机科学与技术专业计算机科学与技术
班级0411005学号2010211912姓名李新娱实验室s401
一、实验题目
认识Tddebug集成操作软件
二、实验目的
1.熟悉汇编程序的开发过程。
2.认识Tddebug集成操作软件。
3.掌握在Tddebug集成环境中编辑、编译、连接汇编语言程序方法。
4.掌握INT21H软件中断来调用DOS内部子程序的方法
三、实验内容及说明
1.实验内容:
数据传送实验
1)编程将数据段中的一个字符串传送到附加段中,并输出附加段中的目标字符串到屏幕上。
参见示例出程序。
2)修改此程序,采用字符串传送指令完成。
2.实验中使用DOS功能调用(INT21H):
参见教材《32位微型计算机原理与接口技术》89页
(1)显示字符串
入口:
AH=09H
调用参数:
DS:
DX=串首地址,‘$’为结束字符。
(2)返回DOS系统
入口:
AH=4CH
调用参数:
AL=返回码
四、实验主要步骤
要求一数据传送实验
1.运行Tddebug软件,选择Edit菜单编写实验程序
2.使用Compile菜单中的Compile和Link对实验程序进行汇编、连接,生成执行文件。
3.使用Rmrun菜单中的Run运行程序,观察运行结果。
4.使用Rmrun菜单中的Debug调试程序,查看程序段、数据段、附加段装入内存后的分配情况。
单步执行数据传送指令后,观察各寄存器及数据区的内容。
过程如下:
3)按F7单步执行,在代码区中有一个三角,表示正在执行的指令。
每一条指令的执行一定会使目标寄存器和状态寄存器发生变化,从相关窗口看结果。
4)检查内存数据区的内容,关键是找出用户程序的数据段和附加段:
●方法1:
在CPU窗口按Tab键使内存数据显示区成为活动区,按Ctrl+G键,输入:
“DS或ES寄存器的值:
偏移地址”,即可显示用户指定的数据区
●方法2:
选择菜单View|Dump,弹出内存数据显示窗口。
3)查看执行结果:
按Alt+F5,切换到用户窗口。
5.更改数据区中的数据,考察、调试程序的正确性。
五、心得体会
通过本次试验我初步认识了汇编程序的开发过程,了解了Tddebug软件,在一开始的试验中反应太慢没有跟上老师,但在自主实践缓解通过与同学交流完成了实验,虽然对代码还不是很熟悉,但Tddebug软件的操作方法已经熟悉,并且掌握了在此环境的编辑、编译、链接汇编语言的程序方法和INT21H的中断调用来调用DOS内部子程序的方法。
实验二I/O程序设计实验日志
指导教师邹洋实验时间:
2013年04月16日
学院计算机科学与技术专业计算机科学与技术
班级0411005学号2010211912姓名李新娱实验室s401
一、实验题目
I/O程序设计
二、实验目的
1.理解软中断的调用方法及中断过程。
2.掌握INT21H软件中断来调用DOS系统I/O子程序的方法。
3.掌握将存储在内存单元中的数据在屏幕上显示的方法。
4.掌握从键盘输入信息到内存的方法。
三、实验要求
1.将指定数据区中一个字节的数据以十六进制数形式显示在屏幕上。
设计思路:
首先将该数以十六进制数形式分解,然后将每一位分别转换为ASCII码送屏幕显示。
其中0H~9H之间的数加30H,即可得0H~9H的ASCII码,而AH~FH的ASCII码,则需再加7H,参见表5-1。
参考程序流程如图2-1所示。
示例程序参见参考程序清单。
2.编程由键盘输入任意一个字符,将该字符的ASCII码值显示在屏幕上。
3.从键盘输入两个1位十进制数,计算二者之和,并将结果显示在屏幕上。
4.编程由键盘输入任意一位数,将该数以二进制数形式显示在屏幕上。
四、实验主要步骤
要求二由键盘输入任意一个字符,将ASCII码值显示在屏幕上
1.画出实验流程图。
参考代码:
;将指定数据区SD的数据以十六进制数形式显示在屏幕上
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
2.运行Tddebug软件,选择Edit菜单编写实验程序
3.使用Compile菜单中的Compile和Link对实验程序进行汇编、连接,生成执行文件。
4.使用Rmrun菜单中的Run运行程序,观察运行结果。
5.使用Rmrun菜单中的Debug调试程序。
单步执行指令,观察各寄存器及数据区的内容。
要求三从键盘输入两个1位十进制数,计算二者之和。
codesegment
assumecs:
code
start:
movcx,2
movbl,0
next:
movah,1
int21h
subal,30h
jcnext
cmpal,9h
janext
addal,bl
daa
movbl,al
movdl,13
movah,2
int21h
movdl,10
int21h
loopnext
movcl,4
movdh,2
next1:
rolbl,cl
movdl,bl
anddl,0fh
adddl,30h
movah,2
int21h
decdh
jnznext1
movah,1
int21h
movah,4ch
int21h
codeends
endstart
五、心得体会
这次实验再次实践了Tddebug软件的使用方法,让我更深层次理解了软中断的调用方法及中断过程,掌握了INT21H软件中断来调用DOS系统I/O子程序的方法和讲存储在内存单元中的数据在屏幕上显示的方法,并且掌握了从键盘输入信息到内存的方法。
在这次实验中我还自己动手写了代码,虽然很多不会都咨询了同学,但后来还是成功实现了功能。
实验三分支程序设计实验日志
指导教师邹洋实验时间:
2013年04月28日
学院计算机科学与技术专业计算机科学与技术
班级0411005学号2010211912姓名李新娱实验室s401
一、实验题目
分支程序设计
二、实验目的
1.掌握比较指令、条件转移指令的用法
2.掌握分支结构程序的组成
3.掌握分支程序的设计、调试方法
三、实验要求
1.判断X的大小,并根据判断结果以不同方式分别显示。
2.键入一个数,判断数是否在53.编写程序,在屏幕上显示一组菜单,根据键盘输入的菜单编号,提示你选择的菜单名。
4.从键盘输入一个字符,判断该字符是小写字母、大写字母、数字或其他字符,并给出相应的提示。
四、实验主要步骤
要求一判断X的大小,并根据判断结果以不同方式分别显示。
1.画出实验流程图。
参考代码:
;设NUMBER单元的数X以及数值N1,N2均为单字节无符号数,请判断X的大小,并根据判断结果分别显示:
N1<=X<=N2,或XN2。
DATASEGMENTUSE16
MESG1DB'N1<=X<=N2$'
MESG2DB'XMESG3DB'X>N2$'
NUMBERDB66;无符号数X
N1EQU22
N2EQU88
DATAENDS
CODESEGMENTUSE16
ASSUMECS:
CODE,DS:
DATA
BEG:
MOVAX,DATA
MOVDS,AX
MOVDX,OFFSETMESG1
CMPNUMBER,N1
JAENEXT;X≥N1转
MOVDX,OFFSETMESG2
JMPDISP
NEXT:
CMPNUMBER,N2
JBEDISP;X≤N2转
MOVDX,OFFSETMESG3
DISP:
MOVAH,9
INT21H;显示结果信息
MOVAH,4CH
INT21H;返回DOS
CODEENDS
ENDBEG
2.运行Tddebug软件,选择Edit菜单编写实验程序
3.使用Compile菜单中的Compile和Link对实验程序进行汇编、连接,生成执行文件。
4.使用Rmrun菜单中的Run运行程序,观察运行结果。
5.使用Rmrun菜单中的Debug调试程序。
观察构成分支条件的各标志的变化情况及相关寄存器内容。
6.更改数据区中的数据,考察程序的正确性。
要求二键入一个数,判断数是否在5DATASEGMENTUSE16
MESG1DB'0$'
MESG2DB'-1$'
NUMBERDB66
N1EQU5
N2EQU24
DATAENDS
CODESEGMENTUSE16
ASSUMECS:
CODE,DS:
DATA
BEG:
MOVAX,DATA
MOVDS,AX
MOVDX,OFFSETMESG1
MOVAH,01H
INT21H
MOVBL,AL
SUBBL,30H
CMPBL,N1
JGNEXT
MOVDX,OFFSETMESG2
JMPDISP
NEXT:
CMPBL,N2
JBDISP
MOVDX,OFFSETMESG2
DISP:
MOVAH,9
INT21H
MOVAH,4CH
INT21H
CODEENDS
ENDBEG
五、心得体会
在上一次实验的基础上,我掌握了比较指令、转移指令使用方法,并初步了解了分支程序的设计、调试方法。
这次要求里面的代码对我来说有点难,不能像以前一样的照猫画虎,让我只能自主思考,主动学习指令并应用。
实验四循环程序设计实验日志
指导教师邹洋实验时间:
2013年05月14日
学院计算机科学与技术专业计算机科学与技术
班级0411005学号2010211912姓名李新娱实验室s401
一、实验题目:
循环程序设计
二、实验目的:
1.掌握比较指令、转移指令和循环指令的使用方法
2.掌握循环结构程序的组成
3.掌握循环程序的设计、调试方法
三、实验要求:
1.求某数据区内负数的个数
为统计数据区内负数的个数,需逐个判别区内的每一个数据,然后将所有数据中凡是符号位为1的数据个数累加起来,即得到区内包含负数的个数。
参见程序清单.
2.试编程统计数据区中正数、零和负数的个数。
3.编程求无符号数字节序列中最大值和最小值
实验中可使用BH和BL作为暂存现行最大值和最小值,且在初始时将BH和BL初始化为首字节的内容,循环依次比较每个字节的内容,求得最大值(存于BH中)和最小值(存于BL中),送屏幕显示。
4.从键盘输入一字符串,搜索该字符串中是否有字符“A”,若有请输出其在串中的位置。
四、实验主要步骤:
要求1求某数据区内负数的个数
1.画出实验流程图。
参考代码:
;确定数据区NUMB中负数的个数(存放于BL中)
DDATASEGMENT
NUMBDB12H,88H,82H,89H,33H,90H,01H,10H,0BDH,01H
MESDB'Thenumberofnegativeis:
$'
DDATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DDATA
START:
MOVAX,DDATA
MOVDS,AX
MOVDI,OFFSETNUMB
XORBL,BL
MOVCX,10
A1:
MOVAL,[DI]
TESTAL,80H
JEA2
INCBL
A2:
INCDI
LOOPA1;统计负数个数
MOVDX,OFFSETMES
MOVAH,09H
INT21H
MOVAL,BL;显示负数个数,注意与实验二所使用的方法的区别
MOVCX,2
A3:
PUSHCX
MOVCL,4
ROLAL,CL
POPCX
MOVBL,AL
ANDAL,0FH
CMPAL,0AH
JBA4
ADDAL,07H
A4:
ADDAL,30H
MOVDL,AL
MOVAH,02H
INT21H
MOVAL,BL
LOOPA3
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
2.运行Tddebug软件,选择Edit菜单编写实验程序
3.使用Compile菜单中的Compile和Link对实验程序进行汇编、连接,生成执行文件。
4.使用Rmrun菜单中的Run运行程序,观察运行结果。
5.使用Rmrun菜单中的Debug调试程序。
观察构成分支、循环条件的各标志的变化情况及相关寄存器内容。
6.更改数据区中的数据,考察程序的正确性。
要求三从键盘输入一字符串,搜索该字符串中是否有字符“A”,若有请输出其在串中的位置。
DATASSEGMENT
cap1db"pleaseinputastring",0dh,0ah,"$"
cap2db"plesaeinputtheletteryousearch",0dh,0ah,"$"
str0db40,?
40dup(0)
str1db40dup(0)
DATASENDS
STACKSSEGMENT
dw40hdup(?
)
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
movdx,offsetcap1;输出提示“pleaseinputastring"
movah,09h
int21h
movdx,offsetstr0;输入一行字符串
;movdh,0ah;此处错误
movah,0ah
int21h
movdl,0ah;以下三行是实现换行功能
movah,02
int21h
movdl,13;以下三行是实现回车功能
movah,02
int21h
movdx,offsetcap2
movah,09h
int21h
movah,01h
int21h
leasi,str0
leadi,str1
;movdh,dl;此处错误,输入放在al中
movdh,al
callsearch
xordh,dh
movcx,dx
;leadi,str0;以下几句是实现依次输入找到的字符串的位置
leadi,str1;
l4:
;loopzl5
;movcl,[di]
movdl,byteptr[di]
cmpdl,0
jzl5
adddl,30h
movah,02h
int21h
movdl,'.'
movah,02h
int21h
incdi
jmpl4
l5:
MOVAH,4CH
INT21H
searchproc;子程序
pushf
pushax
;movcx,[si+1];此处修改
xorcx,cx
movcl,byteptr[si+1]
movdl,0
movax,1
l3:
cmp[si+2],dh
jnzl1
incdl
mov[di],al
incdi
l1:
incax
cmpax,cx
jal2
incsi
jmpl3
l2:
popax
popf
ret
searchendp
CODESENDS
ENDSTART\
五、心得体会:
在上一次实验的基础上,熟悉了比较指令和转移指令,着重学习了循环指令及循环指令的使用方法和循环结构程序的组成,并初步了解了循环程序的设计、调试方法。
循环程序的设计对于我是,在课后还需要巩固加深。