《汇编语言程序设计》实验报告
实验室:S318
最后一次实验时间:
20## 年 5 月18 日
第12周星期二1 - 2节
学院:计算机科学与技术学院
专业:计算机科学与技术
实验一
实验题目:
认识Tddebug集成环境
实验目的:
1. 熟悉汇编程序的开发过程。
2. 认识Tddebug集成操作软件。
3. 掌握在Tddebug集成环境中编辑、编译、连接汇编语言程序方法。
4. 掌握INT 21H软件中断来调用DOS内部子程序的方法
实验主要步骤:
1.运行Tddebug软件,选择Edit菜单编写实验程序
2.使用Compile菜单中的Compile和Link对实验程序进行汇编、连接,生成执行文件。
3.使用Rmrun菜单中的Run运行程序,观察运行结果。
4.使用Rmrun菜单中的Debug调试程序,查看程序段、数据段、附加段装入内存后的分配情况。单步执行数据传送指令后,观察各寄存器及数据区的内容。过程如下:
1) 按F7单步执行,在代码区中有一个三角,表示正在执行的指令。每一条指令的执行一定会使目标寄存器和状态寄存器发生变化,从相关窗口看结果。
2) 检查内存数据区的内容,关键是找出用户程序的数据段和附加段:
l 方法1:在CPU窗口按Tab键使内存数据显示区成为活动区,按Ctrl+G键,输入:“DS或ES寄存器的值:偏移地址”,即可显示用户指定的数据区
l 方法2:选择菜单View| Dump,弹出内存数据显示窗口。
3) 查看执行结果:按Alt+F5,切换到用户窗口。
5.更改数据区中的数据,考察、调试程序的正确性。
6.程序代码:
;数据传送实验,采用相对寻址方式
DDATA SEGMENT ;定义源数据段
MSR DB "HELLO,WORLD!$"
LEN EQU $- MSR
DDATA ENDS
EXDA SEGMENT ;定义附加数据段
MSD DB LEN DUP(?)
EXDA ENDS
MYSTACK SEGMENT STACK ;定义堆栈段
DW 20 DUP(?)
MYSTACK ENDS
CODE SEGMENT ;定义代码段
ASSUME CS:CODE,DS:DDATA,ES:EXDA
START: MOV AX,DDATA
MOV DS,AX ;装载数据段寄存器
MOV AX,EXDA
MOV ES,AX ;装载附加数据段寄存器
MOV SI,OFFSET MSR
MOV DI,OFFSET MSD
MOV CX,LEN
MOV BX,0
NEXT: MOV AL,MSR[BX] ;开始传输数据
MOV ES:MSD[BX],AL
INC BX
LOOP NEXT
PUSH ES
POP DS ;将附加段寄存器指向的段值赋给数据段寄存器
MOV DX,OFFSET MSD
MOV AH,9
INT 21H ;显示字符串
MOV AH,4CH
INT 21H ;返回DOS状态
CODE ENDS
END START
实验结果:
通过Tddebug软件写好实验程序后,对程序进行编译连接,最终生成执行文件,在dos环境下启动后,进入Tddebug,对程序进行单步执行,可看到在每一步执行过程中,程序所分得的地址单元。连接试验箱后,通过对试验箱的操作,能够看到在dos环境下程序的执行步骤。
代码运行结果:显示:“HELLO,WORLD!”
心得体会:
通过本次试验,是我回顾了在学习单片机的时候使用的Tddebug集成开发软件使用方法,了解了汇编程序的开发过程。能够在Tddebug环境下进行编辑、编译、连接程序,掌握了INT 21H软件中断的调用DOS内部子程序的方法。但对于DOS环境下的汇编程序的编辑、编译、连接使用还不是很熟悉,只能是Tddebug集成软件开发环境下熟悉的编译连接运行。
实验二
实验名称:
I/O程序设计
实验目的:
1.理解软中断的调用方法及中断过程。
2.掌握INT 21H软件中断来调用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调试程序。单步执行指令,观察各寄存器及数据区的内容。
更改数据区中的数据,考察程序的正确性
实验代码:
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
实验结果:
代码运行结果:显示“61H”
心得体会:
本次实验要求我们将指定数据区的一个数据转换为其十六进制数,通过这次实验,我充分理解了什么是软中断,以及软中断的调用方法和中断过程,并了解了INT 21H软中断来调用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.更改数据区中的数据,考察程序的正确性。
实验流程图:
代码:
DDATA SEGMENT
MES DB 'The ascii code of decimal code are:$'
BUF DB 30H,30H,30H,31H,32H ;十进制00012的ASCII码
DB 10H DUP(0)
DDATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DDATA
START:MOV AX,DDATA
MOV DS,AX
MOV SI,OFFSET BUF
MOV BL,0AH ;送乘数
MOV CX,0004H ;送转换位数
MOV AH,00H
MOV AL,[SI] ;取第一位ASCII码
SUB AL,30H
A1: INC SI
IMUL BL ;乘10 (AL*BL) 放在AX中
ADD AL,[SI]
SUB AL,30H
LOOP A1
MOV BX,AX
MOV DX,OFFSET MES ;显示提示信息
MOV AH,09H
INT 21H
MOV AX,BX ;显示结果
MOV CX,4
A3: PUSH CX
MOV CL,4
ROL AX,CL ;向左移位
POP CX
MOV BX,AX
AND AL,0FH ;高4位清零,保留低4位的值
CMP AL,0AH
JB A2
ADD AL,07H
A2: ADD AL,30H
MOV DL,AL
MOV AH,02H
INT 21H
MOV AX,BX
LOOP A3
MOV AH,4CH
INT 21H
CODE ENDS
END START
实验结果:
代码运行结果:显示“00001010”
心得体会:
本次实验要求我们将5位十进制数的数字串转换为一个字的二进制数,通过这次实验,我了解了微机中所使用的各类数制及编码方法,并知道了不同进制数及编码相互转换的程序设计方法,加深了对数码转换的理解,并掌握了将存储在内存单元中的数据以十六进制数形式显示在屏幕上的方法。在刚开始实验的时候对于将十进制数转换为二进制有点不知道怎么办,虽然知道应该怎么算,但是却不知道怎么样写代码,通过对参考代码的理解,对于将十进制转换为二进制有了一定的概念,知道了要写一个转换进制的实验的基本步骤了。
对上述实验我进行了一定的修改,代码如下:
data segment
buf db 6,6 dup(0)
msg1 db 'Please input X:',0ah,0dh,'$'
msg2 db 0ah,0dh,'Please input P:',0ah,0dh,'$'
msg3 db 0ah,0dh,'Result: ',0ah,0dh,'$'
data ends
code segment
assume cs:code,ds:data
;将字符串转换为十进制数的子程序
;输入参数:字符处首地址
;输出参数:ax(保存十进制数)
StrToNum proc
push bx
mov bx,10
StrToNum_s1:
mul bx
and buf[si],0fh
add al,buf[si]
inc si
loop StrToNum_s1
pop bx
ret
StrToNum endp
;功能:输出P进制数子程序
;输入参数:ax
;输出参数:无
Print proc
push ax
push bx
push cx
push dx ;保护
xor cx,cx
s1:
mov dx,0
div bx
push dx
inc cx
cmp ax,0
jne s1
mov ah,02h
s2:
pop dx
add dl,30h
cmp dl,39h
ja s1
int 21h
loop s2
jmp ok
add dl,7h
int 21h
loop s2
ok:
pop dx
pop cx
pop bx
pop ax
ret
Print endp
start: mov ax,data
mov ds,ax
mov dx,offset msg1 ;输出msg1
mov ah,09h
int 21h
mov dx,offset buf ;输入十进制数X
mov ah,0ah
int 21h
mov cl,buf[1]
mov si,2
mov ax,0
call StrToNum ;调用将字符串转换为十进制
push ax ;暂存ax
mov dx,offset msg2 ;输出msg2
mov ah,09h
int 21h
mov dx,offset buf ;输入p
mov ah,0ah
int 21h
mov cl,buf[1]
mov si,2
mov ax,0
call StrToNum ;调用将字符串转换为十进制
mov bx,ax
mov dx,offset msg3 ;输出msg3
mov ah,09h
int 21h
pop ax
call Print
mov ax,4c00h int 21h
code ends
end start
运行结果如下:
Please input X: //输入一个数
9
Please input P: //选择显示输出结果的进制数
2
Result:
1001
实验四
实验名称:
综合程序设计
实验目的:
掌握子程序的写法、循环的调用,利用汇编语言编写简单的程序。
实验内容:
编程由键盘输入任意一位数,将该数以二进制数形式显示在屏幕上
要求:含有子程序,循环
实验步骤:
1.画出实验流程图。
2.运行Tddebug软件,选择Edit菜单编写实验程序
3.使用Compile菜单中的Compile和Link对实验程序进行汇编、连接,生成执行文件。
4.使用Rmrun菜单中的Run运行程序,观察运行结果。
5.使用Rmrun菜单中的Debug调试程序。
实验流程图:
实验代码:
;输入一个数,选择显示进制,并在屏幕上显示出来
data segment
buf db ?
msg1 db 'Please input X:',0ah,0dh,'$'
msg2 db 0ah,0dh,'Result: ',0ah,0dh,'$'
data ends
code segment
assume cs:code,ds:data
d_to_b proc near
mov buf, 2
mov cx, 8
mov al, buf
ed:
clc
rcl byte ptr buf, 1
jnc one
mov ah, 02h
mov dl, '1'
int 21h
jmp ll
one:
mov ah, 02h
mov dl, '0'
int 21h
ll:
loop ed
ret
d_to_b endp
start: mov ax,data
mov ds,ax
mov dx,offset msg1 ;输出msg1
mov ah,09h
int 21h
mov ah, 01h
int 21h
mov buf, al
mov dx,offset msg2 ;输出msg2
mov ah,09h
int 21h
call d_to_b
mov ax,4c00h ;返回
int 21h
code ends
end start
实验结果:
代码运行结果:
Please input X:
6
Result:
00000110
心得体会:
本次实验是一个综合性实验的设计,在本次实验中,要求我们编写一个程序,实现从键盘任意输入一位数,将该数以二进制形式显示在屏幕上,并且在程序中必须包括子程序及循环。在做这个题目的过程中,遇到了很多问题,刚开始的时候是使用clc清零CF标志位,但是最终的到的结果是,无论输入什么数,都是00000000,最后经过和同学讨论,猜得到最后的正确结果,不是clc的问题而是需要把后面的一句改成“rcl byte ptr buf, 1”,最后算是水里完成呢个了本次试验。通过这次实验,我对于汇编语言有了更深的了解,并学会了如何用汇编进行简单程序的编写。
实验报告实验名称专业班级信息安全学号姓名实验一汇编语言上机过程和Debug常用调试命令一实验目的学习程序设计的基本方法和技能熟练掌…
汇编语言实验报告题目1实验方法2用表格形式显示字符3分类统计字符个数4查找电话号码学生学院计算机学院专业班级06学号31学生姓名指…
学生实验报告册20xx20xx学年第1学期实验名称汇编语言程序设计学院信息与电气工程学院班级09级计算机科学与技术2班学号1351…
汇编语言程序设计实验报告实验室S318最后一次实验时间20xx年5月18日第12周星期二12节学院计算机科学与技术学院专业计算机科…
实验七分支程序实验目的1掌握利用间接转移指令JMPBX实现多岔分枝的方法2宏替换指令MACRO及ENDM3符号扩展指令CBW实验程…
计算机组成原理与汇编语言实验20xx指导教师签名一实验原理基本知识简单介绍算法流程计算机组成原理与汇编语言实验20xx计算机组成原…
实验六汇编语言程序上机过程实验目的1掌握常用工具软件PEMASM和LINK的使用2伪指令SEGMENTENDSASSUMEENDO…
学生实验报告册20xx20xx学年第1学期实验名称汇编语言程序设计学院信息与电气工程学院班级09级计算机科学与技术2班学号1351…
武汉理工大学华夏学院课程设计报告书课程名称:汇编语言课程设计题目:等腰三角形的输出系名:信息工程系专业班级:计算机1102姓名:学…