330 likes | 619 Vues
广东外语外贸大学. 信息科学技术学院. 《 汇编语言与计算机组成原理 》. 第一篇 汇编语言 调试程序 DEBUG. 调试程序的使用. 熟练使用调试程序是学习和掌握汇编语言的关键! 教学重点 了解 DEBUG DEBUG 中几个主要命令的熟练使用 用 DEBUG 写一个汇编程序. DEBUG 的定义. DEBUG 是专门为汇编语言设计的调试工具 可以 检查 、 修改 、 存储单元 和 寄存器 的内容 可以装入、存储及运行目标程序 也可用 DEBUG 汇编简单的汇编语言程序 但一般人们更多的是用它作为调试工具.
E N D
广东外语外贸大学 信息科学技术学院 《汇编语言与计算机组成原理》 第一篇 汇编语言 调试程序DEBUG
调试程序的使用 熟练使用调试程序是学习和掌握汇编语言的关键! • 教学重点 • 了解DEBUG • DEBUG中几个主要命令的熟练使用 • 用DEBUG写一个汇编程序
DEBUG的定义 • DEBUG是专门为汇编语言设计的调试工具 • 可以检查、修改、存储单元和寄存器的内容 • 可以装入、存储及运行目标程序 • 也可用DEBUG汇编简单的汇编语言程序 • 但一般人们更多的是用它作为调试工具 DEBUG是汇编语言程序员分析、跟踪、修改指令程序的有效工具。
DEBUG启动时的初始化动作 • 段寄存器CS、DS、ES和SS置为DEBUG程序后的第一个段。 • 指令指针寄存器IP置为100H(程序段前缀PSP后的第一个语句) • 堆栈指针SP置为堆栈段的段末 • 其余通用寄存器均置为0,标志寄存器置为下述状态:NV UP EI PL NE NA PO NC • 如果DEBUG命令行含有文件名,段寄存器DS和ES指向程序段前缀PSP(Program Segment Prefix) ,寄存器BX和CX含有程序长度
DEBUG常用命令-D命令 • 显示存储单元的命令 格式为:D [address] 或 D[range] 例1: D 100 功能:查看偏移地址为100H处存储单元的内容 例2:D 100 200 功能:查看偏移地址为100H~200H处存储单元的内容 我们知道:物理地址是由段地址:偏移地址来决定的。这里没写段地址默认为DS。若要查看别的段需用段超越前缀,如:D ES:100
DEBUG常用命令-E命令 • 输入或修改存储单元命令(edit) • 用给定的内容列表来替代指定范围的存储单元内容,格式:E 地址 [内容列表] 例1:-EDS:100 F3‘XYZ’8D ;用五个字节替代存储单元DS:0100到0104的原内容 • 逐个单元相继修改的方法,格式:E 地址 例2:-E CS:100 ;回车后可键入新的内容
DEBUG常用命令-F命令 • 直接填写存储单元内容的命令Fill • 格式:Fill range list • 例如:F CS:0100 L5 F3'XYZ'8D ;使CS:0100-0104单元包含指定的五个字节的内容 • 如果list中的字节数超过指定的范围,则忽略超过的项 • 如果list的字节数小于指定范围,则重复使用list填入,直到填满指定的所有单元为止
DEBUG常用命令-R命令 • 检查修改寄存器的命令-R(register) • 显示CPU内所有寄存器内容及标志位状态 格式: R • 显示和修改某个寄存器内容 格式:R 寄存器名 例:R CX • 显示和修改标志位状态 格式:R F
DEBUG常用命令-A命令 • 汇编命令A(assemble) • 格式:A [address] • 在指定地址处开始编写汇编程序 • 该命令允许键入汇编语言语句,并能把它们汇编成机器代码,相继地存放在从指定地址开始的存储区中。 • 必须注意:DEBUG把键入的数字均看成十六进制数,所以如要键入十进制数,则其后应加以说明,如100D。
A命令举例: -A127C:0100 mov dx,010B127C:0103 mov ah,09127C:0105 int 21127C:0107 mov ah,4c127C:0109 int 21127C:010B db ‘THIS IS AN EXAMPLE’,’$’127C:011E -r cxCX 0000 :011E-n 2.com-wWriting 0011E bytes -qC:\>2
DEBUG常用命令-G命令 • 运行命令G(go) • 格式:G[=地址1][地址2[地址3…]] • 其中,地址1指定了运行的起始地址 • 如不指定则从当前的CS:IP开始运行。 • 后面的地址均为断点地址 • 当指令执行到断点时,就停止执行并显示当前所有寄存器及标志位的内容,和下一条将要执行的指令。
DEBUG常用命令-T命令 • 跟踪命令T(Trace) • 逐条指令跟踪 • 格式:T[=地址] • 从指定地址起执行一条指令后停下来,显示所有寄存器内容及标志位的值。 • 如未指定则从当前的CS:IP开始执行。 • 多条指令跟踪 • 格式:T[=地址][条数] • 从指定地址起执行n条指令后停下来,n由条数指定。
DEBUG常用命令-U命令 • 反汇编命令U(Unassemble) • 从指定地址开始,反汇编32个字节 • 格式为: U [地址] • 例如: U 100 • 如果地址被省略则从上一个U命令的最后一条指令的下一个单元开始显示32个字节。 • 对指定范围内的存储单元进行反汇编 • 格式为: U [range] • 例如: U 100 10C • 从偏移地址为100H处开始反汇编10CH个字节
DEBUG常用命令-N命令 • 给编写的汇编程序命名N(name) • 格式:N filespecs [filespecs] • 命令把两个文件标识符(文件名)格式化写在CS:5CH和CS:6CH的两个文件控制块中,以便在其后用L或W命令把文件装入或存盘。 • filespecs的格式可以是:[d:][path]filename[.exe] • 例如: -N test.exe -L • 结果把文件test.exe从外存装入内存储器。
DEBUG常用命令-L命令 • 程序装入命令L(load) • 将程序装入已在CS:5CH中格式化了的文件控制块所指定的文件 • 格式:L 或 L address • 若命令没规定地址,则文件装入到CS:100开始的内存区中 • 若命令规定了地址,则装入到从指定地址开始内存区域中 • 但对具有扩展名.com或.exe 的文件,则始终是装入到CS:100的内存区中,即使指定了地址,此地址也被忽略。
DEBUG常用命令-W命令 • 把数据写入指定的文件中W(write) • 把内存区域中的数据写入到CS:5CH处的文件控制块所规定的文件中。 • 格式:W [write address] • 若没指定地址则从内存CS:100处开始,若给出了地址,则从指定的地址开始 • 使用W命令之前需要注意的地方: • CS:5CH中必须有写入文件的文件控制块(用N命令) • BXCX(CX为低字,BX为高字)中存入程序段的长度 • 可以利用R BX和R CX写入文件的长度(字节数)
DEBUG常用命令-Q命令 • 退出DEBUG程序的命令Q(quit) • 退出DEBUG,返回到DOS • 该命令无存盘功能,如需存盘应先使用W命令
常用的DOS功能调用 • 书本的第8章专门讲述中断程序设计 • 而在讲第8章以前,我们需要用到几个常用的DOS功能调用,所以这里先简单介绍几个 • 使用方法: 1.设置入口参数(有些不需要设置的就不设置) 2.功能调用号送AH寄存器 3.发软中断指令“INT 21H”
4C号功能调用 • 功能:退回到DOS(操作系统)状态 • 入口参数:无 • 出口参数:无 • 该号功能调用等价于INT 20H中断
4C号功能调用举例 -Amov ah,4c;退出DEBUG,回到DOSint 21 -G;执行程序命令 该程序什么也不做,直接退回到DOS状态。
1号功能调用 • 功能:从键盘上读入一个字符,并将该字符回显在屏幕上 • 入口参数:无 • 出口参数:AL=读到字符的ASCII码 • 说明:如果读到的字符是ctrl+c或ctrl+break,则结束程序
1号功能调用举例 -A mov ah,01;调用1号功能,接受并回显字符int 21 mov ah,4c;退出DEBUG,回到DOS int 21 -G;连续执行程序命令 或者使用单步调试命令,来查看,用户输入的字符是否存入AL寄存器中? -T;单步调试程序 -G=100 104;只执行一部分指令
2号功能调用 • 功能:向屏幕写一字符。 • 入口参数:DL=输出字符的ASCII码 • 出口参数:无 • 说明:在显示输出时检查是否按ctrl+c或ctrl+break键,如果是则结束程序
2号功能调用举例 -A mov DL,31;31=字符‘1’的ASCII码值 mov ah,02;调用2号功能,显示DL中的字符 int 21 mov ah,4c;退出DEBUG,回到DOS int 21 -G;执行程序命令
9号功能调用 • 功能:在屏幕上显示一个字符串。 • 入口参数:DS:DX=需要输出字符串的首地址,字符串以字符‘$’为结束标志。 • 出口参数:无 • 说明:在显示输出时检查是否按ctrl+c或ctrl+break键,如果是则结束程序
9号功能调用举例 -A mov dx,10B;dx=字符串的首地址 mov ah,09 ;调用9号显示字符串的功能号 int 21h mov ah,4c ;退出DEBUG,回到DOS int 21 10B:db ‘hello’,’$’;注意需要以‘$’为结束符 -G ;连续执行程序命令
例题 • 要求: • 用debug编写程序,输出指定的两行字符串 • 串1: ‘THIS IS AN EXAMPLE’,’$’ • 串2: ‘123456789ABCDEF’,’$’ • 注意换行的操作。
例题原代码 -A MOV DX,011C ;dx=串1的首地址 MOV AH,09 ;调用9号功能显示串1 INT 21H MOV DL,0D ;调用2号功能,显示‘回车’ MOV AH,02 INT 21H MOV DL,0A ;调用2号功能,显示‘换行’ MOV AH,02 INT 21H MOV DX,012F ;dx=串2的首地址 MOV AH,09 ;调用9号功能显示串2 INT 21H INT 20H ;退回到DOS状态 011C:DB ‘THIS IS AN EXAMPLE’,’$’;定义数据 012F:DB ‘123456789ABCDEF’,’$’
实验一、DEBUG的使用 • 实验内容: • 练习debug的常用指令 • 用debug编写一个程序,要求:在屏幕上输出2行: 第1行为您的班级英文名 • 第2行为您的汉语拼音的姓名 • 作业取名:ex11.com,并写入硬盘。10月20日前交。
总结 • Debug的几个主要命令需要掌握 • Debug可以编写简单的汇编程序,这些程序所有的段都在同一个段中 • Debug主要用来调试程序,所以,同学们需要熟练使用那些命令,以利于后面的编程
汇编语言程序上机过程 返 回 1 建立汇编语言的工作环境 2 上机操作过程
建立汇编语言的工作环境 返 回 编辑程序,文件名 EDIT.COM 汇编程序,文件名 MASM.EXE 连接程序,文件名 LINK.EXE 调试程序,文件名 DEBUG.EXE LIB.EXE,库管理程序 CREF.EXE,符号索引文件处理程序 EXE2BIN.EXE,将EXE转换为COM的文件格式转换程序
上机操作过程 返 回 • 1.编辑 • 1.对编辑完成的源程序在存盘时扩展名必须加写.ASM • 2.一定要严格遵守汇编语言书写格式及段结构的格式来编写程序 • 2.汇编 • 汇编过程就是将汇编语言源程序转换成机器能够识别的目标代码程序,即OBJ的二进制文件。还可生成扩展名为.LST的列表文件,扩展名为.CRF的符号索引文件。 • 3.连接 • 所谓连接是用连接程序LINK.EXE把若干个经汇编后产生的.OBJ文件及指定的库文件连接起来,产生可执行的.EXE文件。 • 4.调试