汇编上机实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一认识Tddebug集成操作软件实验日志
指导教师曾素华实验时间:2013 年04 月02 日学院计算机科学与技术专业计算机科学与技术
班级0411005 学号2010211912 姓名李新娱实验室s401
一、实验题目
认识Tddebug集成操作软件
二、实验目的
1.熟悉汇编程序的开发过程。
2.认识Tddebug集成操作软件。
3.掌握在Tddebug集成环境中编辑、编译、连接汇编语言程序方法。
4.掌握INT 21H软件中断来调用DOS内部子程序的方法
三、实验内容及说明
1.实验内容:数据传送实验
1)编程将数据段中的一个字符串传送到附加段中,并输出附加段中的目标字符串
到屏幕上。
参见示例出程序。
2)修改此程序,采用字符串传送指令完成。
2.实验中使用DOS功能调用(INT 21H):
参见教材《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软件的操作方法已经熟悉,并且掌握了在此环境的编辑、编译、链接汇编语言的程序方法和INT 21H的中断调用来调用DOS内部子程序的方法。
实验二I/O程序设计实验日志
指导教师邹洋实验时间:2013 年04 月16 日
学院计算机科学与技术专业计算机科学与技术
班级0411005 学号2010211912 姓名李新娱实验室s401
一、实验题目
I/O程序设计
二、实验目的
1.理解软中断的调用方法及中断过程。
2.掌握INT 21H软件中断来调用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的数据以十六进制数形式显示在屏幕上
DATA SEGMENT
MES DB 'Show a as hex:',0AH,0DH,'$'
SD DB 'a'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET MES;显示提示信息
MOV AH,09H
INT 21H
MOV SI,OFFSET SD
MOV AL,DS:[SI]
AND AL,0F0H ;取高4位
MOV CL,4
SHR AL,CL
CMP AL,0AH ;是否是A以上的数
JB C2
ADD AL,07H
C2: ADD AL,30H
MOV DL,AL ;显示字符
MOV AH,02H
INT 21H
MOV AL,DS:[SI]
AND AL,0FH ;取低4位
CMP AL,0AH
JB C3
ADD AL,07H
C3: ADD AL,30H
MOV DL,AL ;显示字符
MOV AH,02H
INT 21H
MOV AH,4CH ;返回DOS
INT 21H
CODE ENDS
END START
2.运行Tddebug软件,选择Edit菜单编写实验程序
3.使用Compile菜单中的Compile和Link对实验程序进行汇编、连接,生成执行文件。
4.使用Rmrun菜单中的Run运行程序,观察运行结果。
5.使用Rmrun菜单中的Debug调试程序。
单步执行指令,观察各寄存器及数据区的内容。
要求三从键盘输入两个1位十进制数,计算二者之和。
code segment
assume cs:code
start:
mov cx,2
mov bl,0
next:
mov ah,1
int 21h
sub al,30h
jc next
cmp al,9h
ja next
add al,bl
daa
mov bl,al
mov dl,13
mov ah,2
int 21h
mov dl,10
int 21h
loop next mov cl,4 mov dh,2 next1:
rol bl,cl mov dl,bl and dl,0fh add dl,30h mov ah,2 int 21h dec dh
jnz next1 mov ah,1 int 21h mov ah,4ch int 21h code ends end start
五、心得体会
这次实验再次实践了Tddebug软件的使用方法,让我更深层次理解了软中断的调用方法及中断过程,掌握了INT 21H软件中断来调用DOS系统I/O子程序的方法和讲存储在内存单元中的数据在屏幕上显示的方法,并且掌握了从键盘输入信息到内存的方法。
在这次实验中我还自己动手写了代码,虽然很多不会都咨询了同学,但后来还是成功实现了功能。
实验三分支程序设计实验日志
指导教师邹洋实验时间:2013 年04 月28 日
学院计算机科学与技术专业计算机科学与技术
班级0411005 学号2010211912 姓名李新娱实验室s401
一、实验题目
分支程序设计
二、实验目的
1.掌握比较指令、条件转移指令的用法
2.掌握分支结构程序的组成
3.掌握分支程序的设计、调试方法
三、实验要求
1.判断X的大小,并根据判断结果以不同方式分别显示。
2.键入一个数,判断数是否在5< X<24范围内,是输出标志0,不是输出-1。
3. 编写程序,在屏幕上显示一组菜单,根据键盘输入的菜单编号,提示你选择的菜单名。
4.从键盘输入一个字符,判断该字符是小写字母、大写字母、数字或其他字符,并给出相应的提示。
四、实验主要步骤
要求一判断X的大小,并根据判断结果以不同方式分别显示。
1.画出实验流程图。
参考代码:
;设NUMBER单元的数X以及数值N1,N2均为单字节无符号数,请判断X的大小,并根据判断结果分别显示:N1<=X<=N2,或X<N1,或X>N2。
DATA SEGMENT USE16
MESG1 DB ' N1<=X<=N2 $ '
MESG2 DB ' X<N1 $ '
MESG3 DB ' X>N2 $ '
NUMBER DB 66 ;无符号数X
N1 EQU 22
N2 EQU 88
DATA ENDS
CODE SEGMENT USE16
ASSUME CS:CODE, DS:DATA
BEG: MOV AX , DATA
MOV DS, AX
MOV DX, OFFSET MESG1
CMP NUMBER, N1
JAE NEXT ;X ≥ N1转
MOV DX, OFFSET MESG2
JMP DISP
NEXT: CMP NUMBER, N2
JBE DISP ;X ≤ N2转
MOV DX, OFFSET MESG3
DISP: MOV AH, 9
INT 21H ;显示结果信息
MOV AH, 4CH
INT 21H ;返回DOS
CODE ENDS
END BEG
2.运行Tddebug软件,选择Edit菜单编写实验程序
3.使用Compile菜单中的Compile和Link对实验程序进行汇编、连接,生成执行文件。
4.使用Rmrun菜单中的Run运行程序,观察运行结果。
5.使用Rmrun菜单中的Debug调试程序。
观察构成分支条件的各标志的变化情况及相关寄存器内容。
6.更改数据区中的数据,考察程序的正确性。
要求二键入一个数,判断数是否在5< X<24范围内,是输出0,不是输-1。
DATA SEGMENT USE16
MESG1 DB ' 0 $ '
MESG2 DB ' -1 $ '
NUMBER DB 66
N1 EQU 5
N2 EQU 24
DATA ENDS
CODE SEGMENT USE16
ASSUME CS:CODE, DS:DATA
BEG: MOV AX , DATA
MOV DS, AX
MOV DX, OFFSET MESG1
MOV AH, 01H
INT 21H
MOV BL,AL
SUB BL,30H
CMP BL, N1
JG NEXT
MOV DX, OFFSET MESG2
JMP DISP
NEXT: CMP BL, N2
JB DISP
MOV DX, OFFSET MESG2
DISP: MOV AH, 9
INT 21H
MOV AH, 4CH
INT 21H CODE ENDS
END BEG
五、心得体会
在上一次实验的基础上,我掌握了比较指令、转移指令使用方法,并初步了解了分支程序的设计、调试方法。
这次要求里面的代码对我来说有点难,不能像以前一样的照猫画虎,让我只能自主思考,主动学习指令并应用。
实验四循环程序设计实验日志
指导教师邹洋实验时间: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中)
DDATA SEGMENT
NUMB DB 12H,88H,82H,89H,33H,90H,01H,10H,0BDH,01H
MES DB 'The number of negative is:$'
DDATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DDATA
START:MOV AX,DDATA
MOV DS,AX
MOV DI,OFFSET NUMB
XOR BL,BL
MOV CX,10
A1: MOV AL,[DI]
TEST AL,80H
JE A2
INC BL
A2: INC DI
LOOP A1 ;统计负数个数
MOV DX,OFFSET MES
MOV AH,09H
INT 21H
MOV AL,BL ;显示负数个数,注意与实验二所使用的方法的区别
MOV CX,2
A3: PUSH CX
MOV CL,4
ROL AL,CL
POP CX
MOV BL,AL
AND AL,0FH
CMP AL,0AH
JB A4
ADD AL,07H
A4: ADD AL,30H
MOV DL,AL
MOV AH,02H
INT 21H
MOV AL,BL
LOOP A3
MOV AH,4CH
INT 21H
CODE ENDS
END START
2.运行Tddebug软件,选择Edit菜单编写实验程序
3.使用Compile菜单中的Compile和Link对实验程序进行汇编、连接,生成执行文
件。
4.使用Rmrun菜单中的Run运行程序,观察运行结果。
5.使用Rmrun菜单中的Debug调试程序。
观察构成分支、循环条件的各标志的变化
情况及相关寄存器内容。
6.更改数据区中的数据,考察程序的正确性。
要求三从键盘输入一字符串,搜索该字符串中是否有字符“A”,若有请输出其在串中的位置。
DA TAS SEGMENT
cap1 db "please input a string",0dh,0ah,"$"
cap2 db "plesae input the letter you search",0dh,0ah,"$"
str0 db 40,?,40 dup(0)
str1 db 40 dup (0)
DA TAS ENDS
STACKS SEGMENT
dw 40h dup(?)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DA TAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
mov dx,offset cap1 ;输出提示“please input a string"
mov ah,09h
int 21h
mov dx,offset str0 ;输入一行字符串
;mov dh,0ah ;此处错误
mov ah,0ah
int 21h
mov dl,0ah;以下三行是实现换行功能
mov ah,02
int 21h
mov dl,13;以下三行是实现回车功能
mov ah,02
int 21h
mov dx,offset cap2
mov ah,09h
int 21h
mov ah,01h
int 21h
lea si,str0
lea di,str1
;mov dh,dl ;此处错误,输入放在al中
mov dh,al
call search
xor dh,dh
mov cx,dx
;lea di,str0;以下几句是实现依次输入找到的字符串的位置lea di,str1;
l4:
;loopz l5
;mov cl,[di]
mov dl,byte ptr [di]
cmp dl,0
jz l5
add dl,30h
mov ah,02h
int 21h
mov dl,'.'
mov ah,02h
int 21h
inc di
jmp l4
l5:
MOV AH,4CH
INT 21H
search proc;子程序
pushf
push ax
;mov cx,[si+1] ;此处修改
xor cx,cx
mov cl,byte ptr[si+1]
mov dl,0
mov ax,1
l3:cmp [si+2],dh
jnz l1
inc dl
mov [di],al
inc di
l1:inc ax
cmp ax,cx
ja l2
inc si
jmp l3
l2:pop ax
popf
ret
search endp
CODES ENDS
END START\
五、心得体会:
在上一次实验的基础上,熟悉了比较指令和转移指令,着重学习了循环指令及循环指令的使用方法和循环结构程序的组成,并初步了解了循环程序的设计、调试方法。
循环程序的设计对于我是,在课后还需要巩固加深。