汇编语言实验教程-ddg
- 格式:doc
- 大小:212.50 KB
- 文档页数:12
《汇编语言》实验指导书计算机实验中心目录目录::实验一利用DEBUG调试程序调试程序段 (4)实验二分支程序实验 (5)实验三循环程序实验 (8)实验四子程序实验(一) (9)实验五子程序实验(二) (13)实验六字符处理程序实验 (19)实验七输入输出实验 (23)试验八中断程序试验 (28)汇编语言上机实验指导书一、概述上机实验总学时为18学时,其中综合性和设计性实验至少为8学时。
实验的次数暂定为8次,每次2-3学时,可结合实际条件适当增减,但不少于6次。
1.实验辅导的主要内容实验辅导的内容包括每个实验的实验目的;实验内容;对实验的算法及实验方法的必要说明;实验准备;实验步骤;实验报告要求;实验程序及参考框图。
开始的实验介绍较细,后面的实验简要介绍。
2.实验的软硬件要求关于汇编语言程序设计的硬件要求不高,有IBM-PC/XT即可,但应有彩色显示器以便进行图形实验。
软件方面应有MASM.EXE5.0版(包括LINK.EXE),与MS-DOS版本配套的DEBUG 程序和EDIT.EXE编辑软件(其它编辑软件也可以)。
3.加强实践能力的培养实验目的不光是为了验证书本理论,更重要的是对实践能力的培养。
其中包括:实际调试程序的能力,例如修改程序参数的能力,查看结果的能力,设置断点调试运行的能力等;开发汇编语言应用程序的能力,例如应用有关汇编软件的能力,进行系统调用和BIOS 功能调用的能力,进行模块程序设计的能力等。
对某一问题用不同的程序实现的能力,例如我们为每个实验提供了参考程序(或程序段),目的是让每个实验者参照样板程序将实验成功地实现,在掌握其方法后,自己改变程序或本分改变程序加以实现。
实验一利用DEBUG调试程序调试程序段1.实验目的:(1)熟悉DEBUG有关命令的使用方法(2)利用DEBUG掌握有关指令的功能(3)利用DEBUG运行简单的程序段2.实验内容(1)进入和退出DEBUG程序(2)学会DEBUG中的D命令、E命令、R命令、T命令、A命令、G命令等的使用。
汇编语言调试程序DEBUG的练习1.目的要求(1)学习使用DEBUG程序的各种命令。
(2)利用DEBUG学习8086指令系统,理解标志位寄存器的意义。
(3)掌握用DEBUG调试汇编程序的方法2.实验内容(1)完成C=A+B的汇编程序。
(2)练习汇编语言指令的使用以及DEBUG的文件调试方法。
3.实验所用仪器、工具计算机一台4. 实验步骤源程序如下:Data segmentA dw 5773hB dw 98cdhC dw ?Data endsCode segmentAssume cs:code, ds:data Start: mov ax,data Mov ax,aAdd ax,bMov c,axMov ah,4ch Int 21hCode endsEnd start步骤:1)打开edit,保存为TEST.ASM2)masm TEST.ASM生成TEST.OBJ3)link TEST.OBJ生成 TEST.EXE4).调试即对生成的EXE的文件进行调试,方法是使用上节我们所学习的DEBUG。
调试步骤:1)D:\MASM\debug TEST.EXE (后缀名不可省略)进入DEBUG的文件调试状态。
该状态与前面我们直接用DEBUG 调试指令的状态是完全不同的,可以通过R指令进行观察;-R2)DEBUG调试EXE文件开始可直接用U0指令查看TEST的代码。
-U03)对应的结果为:反汇编的程序源程序13CF:0000 B8CE13 MOV AX,13CE MOV AX,DATA 13CF:0003 8ED8 MOV DS,AX MOV DS,AX 13CF:0005 A10000 MOV AX,[0000] MOV AX,A 13CF:0008 03060200 ADD AX,[0002] ADD AX,B 13CF:000C A30400 MOV [0004],AX MOV C,AX13CF:000F B44C MOV AH,4C MOV AH,4CH 13CF:0011 CD21 INT 21 INT 21H13CF:0013 0B87C022 OR AX,[BX+22C0]13CF:0017 74E1 JZ FFFA13CF:0019 8B9EFEFE MOV BX,[BP+FEFE]13CF:001D D1E3 SHL BX,113CF:001F D1E3 SHL BX,1与我们原来编的程序比较有什么不同???在程序中我们使用的是A、B、C,但是在该状态下结果就变成了[0000H],[0002H],[0004H]。
南昌航空大学实验报告
年月日
课程名称:汇编语言程序设计实验名称: Windbg调试程序的应用
班级:学生姓名:学号:
指导教师评定:签名:
一.实验目的
1)进一步掌握windbg调试器的使用方法;
2)通过windbg观察不同寻址方式的结果;
3)学习编写简单汇编程序。
二.实验内容
编译eg0002.asm
Windbg调试
设置windbg调试环境
载入调试符号
启动程序定位和程序入口点
单步执行命令
查看变量信息
各类调试窗口
三.实验过程和程序
启动编译环境:
输入命令:
cd progs
make32 eg0002
eg0002
结果如下:
打开程序和源文件
打开源文件和程序加载源文件和可执行文件后,结果:
调整好窗口布局
四.实验结果和分析
载入调试符
加载程序和源码后,在windbg中输入
.reload /f
lm
五.
六.载入eg0002.exe程序的调试符号输入命令:
g @$exentry
程序将直接运行,并在程序入口点停止。
输入命令
dt eg0002!*
五.实验体会
进一步掌握windbg调试器的使用方法,知道windbg调试器各种命令输入使用,并且使用windbg目录下的debugger.chm学会了详细的Windbg使用方法,并且根据windbg 帮助文件,整理常用的调试命令等。
实验七汇编语言调试工具使用
一、实验目的:
掌握汇编语言调试工具基本使用方法。
二、实验环境:
1、硬件:PC机或其兼容机。
2、软件:Windows操作系统,OllyDbg调试工具。
三、预备知识
Ollydbg经典入门教程→新手OllyDbg入门文章→OllyDBG 入门系列(一)-认识OllyDBG、OllyDBG 入门系列(二)-字串参考
四、实验内容:
启动OllyDBG,熟悉操作环境和主要调试功能。
1.通过反汇编分析、调试,找出程序crackme3.exe的用户名和注册码,写出完整操作步骤,截图并加以说明。
2.通过反汇编分析、调试,找出程序crackHead.exe的注册码,写出操作步骤,截图并加以说明。
3.总结以上分析实例中所使用的主要方法。
《汇编语言》实验指导书目录实验一Debug命令的使用 (3)实验二基本汇编指令的使用 (7)实验三汇编语言程序的调试与运行 (10)实验四系统功能调用程序的调试与运行 (15)实验五分支程序设计 (17)实验六循环程序设计 (20)实验七子程序设计 (23)实验八高级汇编语言程序设计 (25)实验九I/O程序设计 (30)实验十中断程序设计 (33)实验十一综合程序设计 (38)实验一Debug命令的使用一、知识点1、DEBUG简介DEBUG.EXE是DOS提供的用于调试可执行程序的一个工具软件。
在汇编语言程序调试中很常用。
DEBUG的提示符是“-”,所有DEBUG调试命令军在此提示符下输入。
DEBUG命令都是一个字母,后跟一个或多个参数,也可使用默认参数。
DEBUG命令的使用注意问题:(1)字母不分大小写(2)只使用十六进制数,但没有带后缀字母“H”(3)命令如果不符合DEBUG的规则,则将以“error”提示,并以“^”指示出错位置。
(4)每个命令只有按下回车键后才有效,可以用Ctrl+Break终止命令的执行。
2、Debug的调入和退出以WIN2000环境为例,点击“开始/运行…”,在“运行”对话框中输入命令:cmd,然后点击“确定”,进入DOS命令行状态:C:\Documents and Settings\lfy>然后输入命令:>Debug进入Debug调试状态,出现Debug命令提示府“-”,在此提示符下可运行所需要的Debug 命令了。
退出Debug的命令:Q3、Debug常用命令(1)汇编命令A,格式为:- A [地址]功能:从指定地址开始允许输入汇编指令,并将该指令汇编成机器指令代码从指定地址开始存放。
若不指定地址,则系统从默认的地址开始存放。
按回车键退出汇编状态应用:用于调试一条指令或几条指令组成的一个程序段。
(2)显示和修改寄存器命令R,格式为:- R [寄存器名]功能:若指定寄存器,则显示指定的寄存器的内容,并可进行修改;若不要修改,则按Enter 健。
、实验一汇编语言上机步骤与DEBUG常用命令的使用【实验目的】(1)汇编语言源程序的编辑、汇编、连接的方法(2)掌握DEBUG常用命令的使用,如汇编命令A、反汇编命令U,查看寄存器命令R,查看内存单元命令D,修改内存单元命令E,填充内存单元命令F,设断点热行命令G及单步执行命令T等;DEBUG常用命令分类命令格式功能说明汇编与反汇编-A[地址] 从指定地址开始汇编程序地址默认值为:CS:IP-U[地址] 从指定地址开始反汇编32字节目标码-U 起始地址终止地址在指定地址范围内反汇编目标码运行与跟踪-G=起始地址][断点1…断点10]在指定地址开始执行到断点为止地址默认值为:CS:IP-T[=地址] 在指定地址执行一条指令后暂停-T[=地在指定地址执行n条指令后址]n 暂停存储单元读写移动比较与搜索-D[地址] 从指定地址开始显示80H字节存储单元内容地址默认值为:CS:IP-D起始地址终止地址显示指定地址范围内存储单元内容-E地址修改内容从指定地址开始逐个单元修改存储内容-S起始地址终止地址被查字符串从指定地址范围内查找字符串段地址默认值为DS寄存器读修改-R 显示所有寄存器的当前值-R 寄存器名显示指定寄存器的当前值,且可修改RF 显示F寄存器各标志位的当前值,且可修改输入输出-I端口地址读入端口地址中的值-O 端口地址值将指定值写到端口地址中退出-Q 结束DEBUG运行,返回DOS。
实验二 Debug的使用(基础与验证型)一、实验要求和目的熟练掌握动态调试程序DEBUG的使用;二、软硬件环境1、硬件环境:微机CPU 486以上,500MB以上硬盘,32M以上内存;2、软件环境:装有MASM 5.0、Debug、LINK、EDIT、CREF.EXE和EXR2BIN.EXE等应用程序。
三、实验涉及的主要知识单元通过编辑、汇编和连接后的程序是可以执行的程序。
但是,一个程序特别是比较复杂的程序不能保证没有一点错误。
因此,在投入正式运行前必须进行调试,以检查程序的正确性。
调试程序Debug就是用来调试汇编语言程序的一种工具。
Debug的主要功能有显示和修改寄存器及内存单元的内容;按指定位置启动并运行程序;设置断点使程序分段运行,以便检查程序运行过程中的中间结果或确定程序出错的位置;反汇编被调试程序,它将一个可执行文件中的指令机器码反汇编成助记符指令并同时给出指令所在的内存位置;单条追踪或多条追踪被调试程序,它可以逐条指令执行或几条指令执行被调试程序,每执行一条(或几条)指令后,Debug程序将中断程序的运行并提供有关结果信息;汇编一段程序,在Debug的汇编命令下可以直接输入助记符指令,并将其汇编成可运行程序段。
此外,Debug还可以将磁盘指定区的内容或一个文件装入到内存或将内存的信息写到磁盘上等等。
启动Debug程序:在DOS状态下可以用下面的命令启动Debug程序:DEBUG [路径文件名.扩展名]Debug后面的文件名及路径是指被调试程序的文件名及路径,Debug后面的文件必须是程序的可执行文件,其扩展名可以是.EXE 或aaa。
在此命令后,DOS将调试程序Debug调入内存,Debug接着将被调程序送入内存。
比如:DEBUG 123.EXE调试程序Debug的主要命令如下:(一)显示内存单元内容的命令D格式(1):-D 位置从指定位置开始,显示128个字节的内容,每一行的左边显示段内偏移位置,接着显示16个单元的内容,最右边区域则显示这一行的16个单元所对应的可显示的字符。
实验一:熟悉环境及DEBUG应用实验目的:1、复习C/C++的变量、地址、指针、内存空间等概念;2、熟悉基本的DOS命令;3、掌握DEBUG的启动及其使用方法与常用命令。
4、初步认识CPU的寄存器。
实验内容:一、C/C++语言回顾目的:通过C/C++的变量、地址、指针、内存空间等概念的回顾,了解计算机内数据的存放方式和访问方式。
1、编程定义一个整型int、一个双精度型double、一个字符型char的指针,并赋初值,然后显示各指针所指目标的值与地址,各指针的值与指针本身的地址及各指针所占字节数(其中地址用十六进制显示,注意字符指针输出是字符串,必须强制转换为无类型指针)。
要求运行结果如下所示:变量内容首地址长度(字节)cval ‘A’0x0012ff64 1类型:整型: int, short int, short, long int, long, unsigned int, unsigned short, unsigned long实型: float, double, long double字符型: char#include<iostream>using namespace std;int main(){int *ip,ival=100;double *dp,dval=99.9;char *cp,cval='A';ip=&ival;dp=&dval;cp=&cval;cout<<*ip<<'\t'<<&*ip<<'\t'<<sizeof(*ip)<<endl;cout<<*dp<<'\t'<<&*dp<<'\t'<<sizeof(*dp)<<endl;cout<<*cp<<'\t'<<(void*)&*cp<<'\t'<<sizeof(*cp)<<endl;//字符指针输出是字符串,必须强制转换为无类型指针cout<<*cp<<'\t'<<&*cp<<'\t'<<sizeof(*cp)<<endl;//输出A开头的字符串cout<<ip<<'\t'<<&ip<<'\t'<<sizeof(ip)<<endl;cout<<dp<<'\t'<<&dp<<'\t'<<sizeof(dp)<<endl;cout<<(void*)cp<<'\t'<<&cp<<'\t'<<sizeof(cp)<<endl;return 0;}2、编程定义一个一维数组、一个二维数组、一个字符串(字符数组)、一个结构体,并赋初值,然后显示各指针所指目标的值与地址,各指针的值与指针本身的地址及各指针所占字节数(长度)。
补充知识常量(放在代码区,不可修改),用#define定义变量(放在数据区,可以修改)变量类型:整型: int, short int, short, long int, long, unsigned int, unsigned short, unsigned long实型: float, double, long double字符型: char3、在实际系统中,许多控制软件需要将数据封装到一个数据结构中,以节省存储空间。
对于位操作,使用汇编语言实现其访问比较容易,但会增加编程难度,因此现在普遍采用C 语言实现。
使用高级语言编程要特别注意结构的存储格式以及编译器的特性。
下面程序所使用的编译器对变量按声明顺序分配地址,目标机为16位机,即int类型占2个字节。
分析下面所示的C语言代码,回答以下问题。
1:typedef struct2: { int A : 16; //按16位字对齐;3: char B : 8;4: char C : 8;5: char D : 8;6: char E : 8;7: int F; //占16位并按16位字对齐;8: }radartype;9: typedef struct10: { unsigned int X; //占16位并按16位字对齐;11: unsigned int Y;12: unsigned int Z;13: unsigned int U;14: } datatranstype;15: radartype myRadarData[2]=16: {{1, 'a', 'b', 'c', 0, 512}, {2, 'x', 'y', 'z', 0, 1024}};17:18:void main(void)19:{ radartype *p;20:datatranstype *q;21:p = myRadarData;22: q = (datatranstype *)p; 23: q++; 24: }(1)如果处理机按16位编址,请在下图的存储器图表中填入myRadarData 数据的存储内容(十六进制表示)。
(a 、b 、c 字符的ASCII 码分别为:61H 、62H 、63H , x 、y 、z 字符的ASCII 码分别为:78H 、79H 、7AH )(2)在上述程序中,第22行的语句执行完成后,下列语句的结果是多少? q->X = q->Y = q->Z = q->U =若再执行一次q++,则下列语句的结果又是多少? q->X = q->Y = q->Z = q->U =二、DOS 应用常用命令:dir 、cd 、md 、rd 、edit 、del 、rename 、copy 一、DOS 操作1、显示目录内容:dir dir dir /w /p2、改变(切换)目录:cd cd cd .. cd \3、创建文件夹:md15 7 0myRadarData[0]0x5000 0x5002 0x5004 0x500615 7 0 myRadarData[1]0x500C 0x500E0x5008 0x500Amd test4、删除文件夹:rdrd test5、创建编辑文件:editedit test.asm6、复制文件:copycopy test.asm test1.asm7、删除文件:deldel test1.asm8、修改文件名:renamerename test.asm test2.asm当前目录. / 上一级目录:../三、DEBUG操作进入DEBUG中,使用相关的命令,完成如下实验:1)考察ROM BIOS中的数据;2)考察显示LCD;3)检查BIOS数据区(检查400H单元内的数据);4)向内存从B8100H开始的单元中填写数据;5)获得当前日期和时间;6)使用INT完成显示;7)使用Debug,输入汇编代码,并执行;8)简单com程序设计(选做)。
1、考察ROM BIOS中的数据(1)检查版权通告和系列号计算机的版权通告是嵌入在ROM BIOS中的FE000H单元。
在debug下输入: d fe00:0(2)检查ROM BIOS数据机器制造日期是按mm/dd/yy记录的,起点在FFFF5H单元。
在debug下输入: d ffff:5(提示:请找到这个生产日期并试图改变它,向地址C000~FFFF的内存单元中写入数据的操作是无效的,因为这等于改写只读存储器中的内容。
)2、考察显示LCD在debug下输入以下命令:F B800:00 F9F 20 70 全屏白色F B800:00 F9F 20 40 全屏红色F B800:00 F9F 20 20 全屏绿色F B800:00 F9F 20 10 全屏蓝色F B800:00 F9F C5 07 C4 07 全屏白色十字网格F B800:00 F9F C5 04 C4 04 全屏红色十字网格F B800:00 F9F C5 02 C4 02 全屏绿色十字网格F B800:00 F9F C5 01 C4 01 全屏蓝色十字网格3、检查BIOS数据区(检查400H单元内的数据)(1)检查串行与并行端口BIOS数据区的第一个16字节包含串行与并行端口的地址 d 40:00第一个4个字表示串口COM1~COM4,如果有两个串口,则第一个双字是以相反字节顺序排列的F803和F802,端口是在03F8和02F8。
第二个4个字表示并行端口LPT1~LPT4,对于有一个并行端口的系统,第一个字很可能是7803,它对应的端口0378(2)检查Shift状态d 40:17首先,确定NumLock与CapsLock关闭,00 00其次,打开NumLock与CapsLock键60 00(3)检查显示状态第一个显示区:d 40:49第一个字节包含当前显示方式:03表示彩色,第二个字节是屏幕上的列数:50h = 80d 40:84 处显示行数:31h = 504、向内存从B8100H开始的单元中填写数据如:-e B810:0000 01 01 02 02 03 03 04 04(向地址A000~BFFF的内存单元中写数据,就是向显存中写入数据。
)5、获得当前日期和时间访问当前日期的指令时int 21h,功能码是2ah,a 100mov ah, 2aint 21jmp 100键入r显示寄存器,并键入t 执行mov,再键入p 运行到中断程序,结果AL:星期,其中0=星期日CX:年(例如:07D6H=2006)DH:月(01H到0CH)DL:日(01H到1FH)访问当前日期的指令时int 21h,功能码是2Ch,把小时送到CH,把分钟送到CL,把秒送到DH,把百分之一秒送到DL。
6、使用INT完成显示a 100mov ah, 09mov dx, 109int 21jmp 100db ‘your name’, ‘$’//结束显示7、使用Debug,输入机器代码或汇编代码,并执行将下面的程序段(机器码和汇编代码)分别写入内存,逐条执行,观察每条指令执行后,CPU中相关寄存器中内容的变化。