资源描述
实验一 指令与汇编语言基础
一、实验目的
(1)了解命令行操作基本方式和基本命令,掌握PC 环境下命令行方式的特点;
(2)掌握汇编语言程序指令编辑、宏汇编、连接、运行基本概念;
(3)熟练掌握动态调试程序TD 的常用命令和窗口功能,学会用TD 调试程,修改环境;
(4)学会利用DEBUG 或TD 检查认识指令功能的正确方法。
二、 实验任务及内容
(1) 掌握进入全屏命令行方式、修改环境的方法;
启动开始菜单里的运行选项,键入cmd,即可启动命令行方式,在其属性栏中按图3.1-1 圈中所示设置可进入全屏命令行方式:
(2) 确定源程序的存放目录,构建个人实验环境
(3) 建立、编辑汇编源程序,选择程序样本,构建典型的汇编程序框架,包括基本的数据段、堆栈段和代码段,编写程序实现如下功能:在data1 和data2 两个存储单元中分别存放两个16 进制数,将它们相加后所得值存入data3 中。
(4) 用汇编工具(MASM/TASM.EXE)汇编源程序产生OBJ 目标文件将所要编译的源程序文件(add.asm)放到带汇编工具的文件夹中,在全屏命令行模式下,进入该文件夹,输入tasm add.asm,回车后即可编译产生OBJ 目标文件。
(5) 用链接程序(LINK/TLINK.EXE)产生EXE 可执行文件产生OBJ 目标文件后,继续输入:tlink add.obj,回车后即可产生EXE 可执行文件。
(6) 用调试工具软件(TD.EXE/D)调试执行程序
用编辑软件,输入以下汇编语言源程序:
;将data1和data2中的两个四位16进制数相加
data segment
data1 db 12H,34H ;加数1
data2 db 56H,78H ;加数2
data3 db 2 dup(?) ;和
data ends
stacks segment stack
db 256 dup(?)
stacks ends
code segment
assume cs:code,ds:data,ss:stacks
main proc far
start:mov ax,data
mov ds,ax
mov ax,stacks
mov ss,ax
mov si,0
mov cx,2 ;设置循环次数
loop1:mov al,data1[si] ;取加数1
mov data3[si],al
mov al,data2[si] ;取加数2
adc data3[si],al
inc si
loop loop1
mov ah,4ch ;程序结束返回
int 21h
main endp
code ends
end start
三、 用tasm add.asm生成obj文件,用tlink生成exe文件,再用TD打开。
用 TD 将可执行文件调入,并进行调试;
四、① 在Windows 中启动TD
a. 仅启动TD 而不载入要调试的程序
双击TD.EXE 文件名,Windows 就会打开一个DOS 窗口并启动TD。启动TD 后会显示一个版权对话框,这时按回车键即可关掉该对话框。
b. 启动TD 并同时载入要调试的程序
把要调试的可执行文件拖到TD.EXE 文件名上,Windows 就会打开一个DOS 窗口并启动TD,然后TD 会
把该可执行文件自动载入内存供用户调试。若建立可执行文件时未生成符号名表,TD 启动后会显示
“Program has no symbol table”的提示窗口,这时按回车键即可关掉该窗口。
② 观察CPU 寄存器、存储器环境
TD 启动后呈现的是一个具有窗口形式的用户界面,见图3.1-2,称为CPU 窗口。
③ 单步、断点运行,观察中间结果,完成正常执行
TD 功能键F7 为跟踪进入(对CALL 指令将跟踪进入子程序),F8 为单步跟踪(对CALL 指令将执行完子
程序返回后才停下),F2 为在当前光标处设置/清除断点。通过单步,断点运行中观察数据区、各个寄存器值的变化,以验证程序运行是否正确。
④ 修改当前运行环境,直接编写程序片断,验证指令功能
修改寄存器(AX、BX、CX、DX、SI、DI、BP、SP),并观察;修改段寄存器。
b. 修改存储器,并指定不同存储段。
c. 修改CS:IP,单步运行指定指令(F7 或F8),观察指令运行结果。
d. 将光标放置在TD 窗口的代码区右击,可显示代码区的局部菜单,见图3.1-3,选择相应功能进行
操作。
⑤ 重点解决段存储结构和数据变量的定义与访问
访问数据段中具体位置的值时,可将光标放置在数据区,右击产生数据区菜单。
开始
调用程序并返回
保存现场
DS段初始化
赋值
调用程序并返回
赋值
调用程序并返回
赋值
结束
带进位相加
实验二 汇编语言程序设计
一、 实验目的
1、进一步熟悉汇编语言程序的编辑、宏汇编、链接、运行基本概念;
2、熟悉掌握动态调试TD/DEBUG的常用命令或窗口功能,学会用TD/DEBUG调试程序,修改数据和寄存器等环境;
3、熟悉掌握汇编语言程序的典型数据结构设计、典型程序流控制及方法,了解DOS/BIOS功能调用的基本方法。
二、基本实验内容
(1)编写程序实现如下功能:
① 从键盘输入任意字符串后,存入自定义存储单元,判断处理后将字符串中小写字母转换为大写字母
(其他字符不变)并按原顺序将这些字符在屏幕上显示出来。
② 从键盘输入在0~65535 之间的十进制数,将其转换为16 进制数并在屏幕中显示出来,要求判断输
入字符串是否为在0~65535 之间的十进制数。
(2)复习TD 各种操作,并用DEBUG 调试程序,学会基本命令操作,并通过单步、设置断点等方法观
察中间结果,完成正常运行。
命令行方式下直接键入debug myfile.exe 回车(myfile 为待调试可执行程序),进入调试方式(显示-),键入H 回车显示全部命令、格式和功能。常用命令有:U(反汇编)、A(汇编输入指令程序)、R(寄存器显示/修改)、I(端口输入)、O(端口输出)、D(显示数据)、E(修改数据)。
除资源修改管理功能外,重点应用T(单步)、Tn(执行n 步)、P(过程/指令)、G××××(从当前CS:IP执行到断点××××)或G=××××1 ××××2(从××××1 执行到××××2 断点)调试实验程序。
二. 实验原理
运行汇编程序必备的软件环境:DOS操作系统,汇编软件系统。
汇编系统盘应包含如下文件:MASM宏汇编程序文件 (TASM)、LINK连接程序文件 (TLINK)、CREF索引程序文件(也可不用)、EDIT文本编辑程序(或PE等文本编辑程序)。
用户通过屏幕编辑程序EDIT键入源程序,检查无误,可将源程序存到汇编系统盘上,该程序的扩展名为(.ASM)。
执行宏汇编程序MASM----生成目标文件.OBJ,辅助文件LST,CRF。用汇编语言编写的源程序必须是一个完整的源程序,才能经过宏汇编程序MASM的汇编,生成一个目标程序。为了完成汇编任务,汇编程序一般采用两遍扫描的方法,第一遍扫描源程序产生符号表、处理伪指令等,第二遍扫描产生机器指令代码、确定数据等。
汇编语言编写的源程序经过汇编程序(MASM)汇编后产生了目标程序(.OBJ),该文件是将源程序操作码部分变成了机器码,但地址是可浮动的相对地址(逻辑地址),因此必须经过连接程序LINK连接后才能运行。连接程序LINK是把一个或多个独立的目标程序模块装配成一个可重定位的可执行文件,扩展名为.EXE文件。此外还可以产生一个内存映象文件,扩展名为.MAP。连接程序执行过程为:由连接程序LINK产生的扩展名为.MAP文件,它实际上是连接程序的列表文件,它给出了每个段的地址分配情况及长度,(加/M开关――外部变量相对地址。
汇编后产生的交叉索引文件,扩展名为.CRF,它列出了源程序中定义的符号(包括:标号、变量等)和程序中引用这些符号的情况。
如果要查看这个符号表,必须使用CREF.EXE的文件,它根据.CRF文件建立一个扩展名为.REF的文件,而后再用DOS的TYPE命令显示,就可以看到这个符号使用情况表。
调试工具有:DEBUG、TD。其中,TD. EXE(简称TD)是一个具有窗口界面的程序调试器, 是Borland 公司产品Turob Debugger 的IA-16版本。利用TD,用户能够调试已有的可执行程序(后缀为EXE);用户也可以在TD中直接输入程序指令,编写简单的程序。 DEBUG能够在最小环境下运行汇编程序(代码级而非符号级)、提供极简单的修改手段(寄存器、存储器、I/O等)、提供用户与计算机内部联系的窗口(命令行):显示、修改、单步、过程、断点、文件装入、上装。是典型的命令行方式调试工具,其I O 命令用于硬件测试、
三、 程序流程图
(1)、data segment
input db 100,100 dup(0)
string1 db 0dh,0ah,'please input your strings',0dh,0ah,'$'
string2 db 0dh,0ah,'the strings you input are:',0dh,0ah,'$'
string3 db 0dh,0ah,'Do you want to continue (y/n):',0dh,0ah,'$'
data ends
stacks segment stack
db 256 dup(0)
stacks ends
code segment
assume cs:code,ds:data,ss:stacks
main proc far
start: mov ax,data
mov ds,ax
mov ax,stacks
mov ss,ax
loop1: mov dx,offset string1
mov ah,09h
int 21h
mov dx,offset input
mov ah,0ah
int 21h
mov dx,offset string2
mov ah,09h
int 21h
call disp
mov dx,offset string3
mov ah,09h
int 21h
mov ah,1
int 21h
cmp al,'y'
jz loop1
mov ah,4ch
int 21h
main endp
disp proc near
xor cx,cx
mov cl,input[1]
mov si,2
again: mov dl,input[si]
cmp dl,61h
jb next
cmp dl,7ah
ja next
sub dl,20h
next: mov ah,02h
int 21h
inc si
loop again
ret
disp endp
code ends
end start
(2)、data segment
right db 1
input db 6,7 dup(0)
output dw 0000h
ten dw 000ah
string1 db 0dh,0ah,'please input your number (0~65535)',0dh,0ah,'$'
string2 db 0dh,0ah,'The number you input is:',0dh,0ah,'$'
string3 db 0dh,0ah,'Do you want to continue (y/n):',0dh,0ah,'$'
string4 db 0dh,0ah,'The number you input is not from 0~65535',0dh,0ah,'$'
data ends
stacks segment stack
db 256 dup(0)
stacks ends
code segment
assume cs:code,ds:data,ss:stacks
main proc far
start: mov ax,data
mov ds,ax
mov ax,stacks
mov ss,ax
loop1: mov output,0000h
mov dx,offset string1
mov ah,09h
int 21h
mov dx,offset input
mov ah,0ah
int 21h
mov right,1
call change
cmp right,0
jz error
mov dx,offset string2
mov ah,09h
int 21h
mov ax,output
mov dl,ah
shr dl,4
call disp
mov dl,ah
and dl,0fh
call disp
mov dl,al
shr dl,4
call disp
mov dl,al
and dl,0fh
call disp
jmp go
error: mov dx,offset string4
mov ah,09h
int 21h
go: mov dx,offset string3
mov ah,09h
int 21h
mov ah,1
int 21h
cmp al,'y'
jz loop1
mov ah,4ch
int 21h
main endp
change proc near
clc
xor ax,ax
xor bx,bx
xor dx,dx
mov cl,input[1]
mov si,2
again: mov bl,input[si]
cmp bl,30h
jb error1
cmp bl,39h
ja error1
sub bl,30h
dec cl
cmp cl,0
jz over
mov ax,1
push cx
loop2: mul ten
loop loop2
pop cx
mul bx
add output,ax
jc error
inc si
jmp again
over: add output,bx
jnc over1
error1: mov right,0
over1: ret
change endp
disp proc near
push dx
push ax
cmp dl,9
jbe num
add dl,7
num: add dl,30h
mov ah,02h
int 21h
pop ax
pop dx
ret
disp endp
code ends
end start
展开阅读全文