2022年用DEBUG学习汇编语言参考 .pdf
1 利用 DEBUG 学习汇编语言编写汇编语言有两种主要的方法:1. 使用 MASM 或 TASM 等编译器 (TASM是 borland 公司生产的编译器。和 turbo系列配套的 , 在 32 位的 CPU 上用);2. 使用调试程序 DEBUG.COM。DEBUG 其实并不能算是一个编译器,它的主要用途在于除错,即修正汇编程序中的错误。不过,也可以用来写短的汇编程序,尤其对初学者而言, DEBUG 是最佳的入门工具。 因为 DEBUG 操作容易: 只要键入DEBUG 回车, A回车即可进行汇编,过程简单,而使用编译器时,必须用到文本编辑器、编译器本身、 LINK以及 EXE2BIN 等程序,其中每一个程序都必须用到一系列相当复杂的命令才能工作,而且用编译器处理源程序, 必须加入许多与指令语句无关的指示性语句即伪指令,以供编译器识别。使用 DEBUG 可以避免一开始就碰到许多难以理解的程序行。DEBUG 除了能够汇编程序之外, 还可用来检查和修改内存位置、载入储存和执行程序、以及检查和修改寄存器,换句话说,DEBUG 是为了让我们接触硬件而设计的。80 x86 和 Pentium微处理器的寄存器功能结构处理器中一些可以保存数据的地方被称作寄存器。寄存器可以被装入数据,也可以在不同的寄存器之间移动这些数据,或者做类似的事情。 基本上,像四则运算、位运算等这些计算操作,都主要是针对寄存器进行的。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 9 页 - - - - - - - - - 2 图 1180 x86 和 Pentium 微处理器的基本结构寄存器一、 DEBUG 常用指令剖析A (Assemble) 汇编指令1. 输入汇编语句被汇编到内存的指定区段, 此区段在开始时用 A 100 指定。2. 所有语句输入完成后 , 按 ENTER 键返回。3. 完成输入后 , 可以用 U命令观看它的反汇编码。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 9 页 - - - - - - - - - 3 格式: -A如果 A后无地址,则 DEBUG 会将 DS :100例 A:DEBUG-a 010008F1:0100 MOV DX,109 08F1:0102 MOV AH,0908F1:0105 INT 21H08F1:0107 INT 20H08F1:0109 db May I help you? $08F1:0115 a-g May I help you Program terminated normallyD (Dump) 显示命令1. 从指定的地址开始显示内容, 如果没有指定地址 , 则从前一个 D命令继续显示。2. 如果没指定地址并是第一次, 则从 DS:100处开始显示。D 100 ; D 0100 011F ; D FE00:0 ; 回车后可以看到结果,这个就是主板BIOS 的厂商信息D FFFF:5 L8 ; 回车后,主板的 BIOS 版本日期也出来了G (Go) 转移命令1. 执行正在调试的程序 , 当执行到指定的地址时停止, 并显示寄存器和下一条要执行的命令。2.G =address 。用于执行正在调试没有断点的程式,起始地址默认为: DS:100。3. 程序运行结束 ,DEBUG 显示Porgram terminated normally 。R (Register) 寄存器命令1. 显示一个寄存器的十六进制内容, 并可根据需要改变它们。2. 显示 8 个字母的状态标志 , 并可根据需要更改它们之中的任一个或全部。若想改变标志寄存器,用 -RF回车,则 DEBUG 会将标志内容显示出来,若想改变标志名称设置溢出 OV(溢出) NV( 未溢出 ) 零位 ZR NZ( 不等于零 )方向 DN(减少) UP( 增加) 辅助进位 AC NA(无进位 )中断 EI( 许可) DI( 禁止) 奇偶标志 PE(偶) PO( 奇)符号 NG(负) PL( 正) 进位 CY NC(清除进位 ) 例:-RfNV UP EI PL NZ NA PO NC:- OV DI名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 9 页 - - - - - - - - - 4 下表是 debug 中的标志寄存器和cpu 中的标志寄存器不同表示的对照:序号类别1 2 3 4 5 6 7 8 9 EFLAG OF DF IF TF SF ZF AF PF CF DEBUG=1 OV UP EI NG ZR AC PE AC DEBUG=0 NV DN DI PL NZ NA PO NA U (Unassemble) 反汇编命令1. 对指令进行反汇编 , 它们的地址和十六进制以类似于汇编语言的语句一起显示出来。2. 单独用 U命令从 CS:100处开始反汇编。3.U 命令默认段地址包含CS寄存器中。T (Track)跟踪命令T =addressvalue 可以跟踪执行单条指令,也可以由velue 决定执行几条指令。每执行一条指令,IP 就自动指向下一条指令地址。什么是 DOS 、BIOS功能调用? INT 功能号。表一: DEBUG的基本指令用法一览表指令格式功能备注A A 记忆体位址 编译汇编语言指令A 100 C C 区段 1 区段范围 区段 2 将两块内存作比较C 100 L20 200 D D 记忆体位址 显示记忆体的内容D 100 E E 记忆体位址 编辑记忆体资料E 100 F F 指定区段范围 填充指定内存区块内容F 100 L10 90 G G 区段: 区址 带有任选断点执行G 100 H H 运算子 运算子 十六进制加减运算H 44 33 I I 端口 读/ 显示输入字节 I 70 L L 记忆位址 或 磁碟, 磁轨, 扇区 装入文件或磁区L 100 2 1 2 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 9 页 - - - - - - - - - 5 M M 区段范围 记忆体位址 传送内存区块M 100 L10 110 N N 档案名称 定义文件及参量N ; 其后用 L O O 端口位址 输出字节到端口O 70 19 P P 区段: 区址 在下一指令上停止P 2 Q Q 退出 DEBUG 界面Q R R 寄存器 显示修改寄存器 /标志R AX S S 记忆区段范围 对字符进行检索S 100 L70 j T T = 记忆区段 或 数值范围 单步追踪T U U 记忆位址 对指令进行反汇编U 100 W W 记忆区段 或 指定范围 写入文件或磁盘扇区W 100 0 1 1 二、操作实例DEBUG 的的 A命令可以汇编出简单的COM 文件,规定 DEBUG 编写的程序一定要由地址 100h 开始。试比较下面两种方法的赋值:A100 MOV AX,1111 MOV BX,2222 MOV CX,3333 用 T 命令检查寄存器的数值。然后改用R命令赋值:-RAX 回车出现AX 0000 : 这里再输入数据 1111 R; 即可查到 AX为 1122 1. 输入 A100 ;从 DS :100开始汇编2. 输入 MOV DL,41 ; 将数值 01h 装入 DL 寄存器3. 输入 MOV AH,2 ; 将数值 02h 装入 AH 寄存器4. 输入 INT 21 ; 调用 DOS 21号中断 2 号功能,用来逐个显示装入DL的 ACSII 码字符。( AH 02H号调用的显示字符; DL 要输出显示的 ACSII 字符名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 9 页 - - - - - - - - - 6 代码)5. 输入 INT 20 ; 调用 DOS 20 号中断,终止程序,将控制权交回给 DEBUG 6. 请按 Enter 键7. 现在已将汇编语言程序放入内存中了,输入 G( 运行) 8. 出现结果:输出一个大写字母A。当然可以用其它 ascii码取代,如 31 为“1”,42为“B”等。Program terminated normally表示机器正常结束。我们可以用命令将十六进制的机器码反汇编(Unassemble)成汇编指令。你将发现每一行右边的汇编指令就是被汇编成相应的机器码,而8086 实际上就是以机器码来执行程序。1. 输入 U100,106 1FED:0100 B201 MOV DL,01 1FED:0102 B402 MOV AH,02 1FED:0104 CD21 INT 21 1FED:0106 CD20 INT 20 DEBUG 可以用命令来查看、改变寄存器内容。CS :IP 寄存器,保存了将执行指令地址。1. 输入 R AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1FED ES=1FED SS=1FED CS=1FED IP=0100 NV UP EI PL NZ NA PO NC 1FED:0100 B201 MOV DL,01 当程序由 DS :100 开始执行,那么终止程序时,DEBUG 会自动将 IP 内容重新设定为 100。当你要将此程序做成一个独立文件存盘,则可以用命令对该程序命名。 但一定要为 COM 文件,否则无法以DEBUG 载入。存盘,创建文件:1. 输入 N SMILE.COM ; 我们得告诉 DEBUG 程序长度:程序从 100开始到 106,故占用 7 字节。我们利用 BX存放长度值高位部分 ,而以 CX存放低位部分 。2. 输入 RBX ;查看 BX 寄存器的内容,本程序只有7 个字节,故本步可省略3. 输入 RCX ;查看 CX 寄存器的内容4. 输入 8 ;程序的字节数5. 输入 W ;用命令将该程序写入(Write )磁盘中修行至此,我们便可以真正接触8086汇编指令了。 当我们写汇编语言程序的时候,通常不会直接将机器码放入内存中,而是打入一串助记符号 (Mnemonic Symbols),这些符号比十六进制机器码更容易记住,此之谓汇编指令。助记符名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 9 页 - - - - - - - - - 7 号,告诉 CPU 应执行何种运算。也就是说,助忆符号所构成的汇编语言是为人设计的,而机器语言是对PC设计的。现在,我们再来剖析一个可以将所有ASCII 码显示出来的程序。1. 输入 DEBUG 2. 输入 A100 3输入 MOV CX,0100 ;装入循环次数 MOV DL,00 ;装入第一个 ASCII 码,随后每次循环装入新码 MOV AH,02 INT 21 INC DL ;INC:递增指令,每次将数据寄存器 DL 内的数值加 1 。 LOOP 0105 ;LOOP :循环指令,每执行一次 LOOP ,CX值减 1, CX 不等于 0 就跳到循环起始地址105,直到 CX为 0,循环停止。 INT 20 4. 输入 G 即可显示所有 ASCII 码。下面用一条伪指令编程。在汇编语言中,有两种不同的指令:1. 正规指令:如 MOV 等,是属于 CPU的指令,用来告诉 CPU 在程序执行时应做些什么, 所以它会以运算码 (OP-code)的方式存入内存中; 2. 伪指令:如 DB等,是属于 DEBUG 等编译器的指令,用来告诉编译器在编译时应做些什么。DB (Define Byte)指令用来告诉 DEBUG 将单引号内的所有 ASCII 码放入内存中。使用 9 功能的字符串必须以 $结尾。用命令可用来查看 DB伪指令将那些内容放入内存。现在,我们来剖析另一个程序: 由键盘输入任意字符串, 然后显示出来。 db 20指示 DEBUG 保留 20h 个未用的内存空间供缓冲区使用。A100 MOV DX,0116 ;DS:DX 缓冲区地址,由 DB伪指令确定缓冲区大小MOV AH,0A ;0Ah 号功能调用键盘输入缓冲区INT 21 ;MOV DL,0A ;由于功能 0Ah在每个字符串最后加一个归位码(0Dh由MOV AH,02 Enter产生),使光标自动回到输入行的最前端,为了INT 21 使新输出的字符串不会盖掉原来输入的字符串,所以利用功能 2 加一个换行码 (OAh),使得光标移到下一行的的最前端。MOV DX,0118 ;装入字符串的起始位置MOV AH,09 ;9h 功能遇到 $符号才会停止输出,故字符串最后必须上$ INT 21 ;否则 9h 功能会继续将内存中的无用数据胡乱显示出来INT 20 DB 20 ;定义缓冲区名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 9 页 - - - - - - - - - 8 DEBUG 技巧应用1. 用 DEBUG 对子目录加密DOS 在管理文件目录时 , 用 32 个字节来保存根目录和子目录的信息, 对子目录而言,0 10 字节为子目录域 , 第 11 字节为属性。我们只要将子目录属性字节的值从 10H改为 13H时, 子目录即具有拒绝DIR,TREE等命令的性能。例如 : 对 A盘的 SUBDIK 子目录进行加密 : C:DEBUG -L 100 0 5 7 (将 A盘中目录读入内存,即将0 面,5 道,7 扇区的内容装入 ) -S 100 FFF SUBDIK (搜索子目录 ) -38EB:07c0 ( 搜索到的子目录地址 ) -E 07CB (07C)+0B=07CB 为属性字节位址 ) 38EB:07CB 10。13 ( 修改完成 ) -W 100 0 5 7 (目录写回 A盘中) -Q ( 退出) 2. 解除 BIOS密码忘记 BIOS 密码,一般都采用放电法来清空密码,但这对普通用户有一定难度,并且还得开机箱。其实利用Debug 的 0 命令则简单得多!请在 “ -” 后输入以下命令:O 70 19 O 71 15 q 重启电脑,系统提示 CMOS 校验和出错,并要求重新进入 BIOS 设置 CMOS。70 和 71 是 CMOS 的两个端口,我们可以在它们的后面随意写入一些错误数据(如 19、16、17 等) ,就会清空 CMOS 里所有设置,如果不见效不妨多用几个数据试试。3. 冷启动实现C:DEBUG RESET.COM -A 100 JMP FFFF:0000 INT 20 -RCX 00007 -W -Q 4. 热启动实现C:DEBUG BOOT.COM 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 9 页 - - - - - - - - - 9 -A 0100 MOV AX,0040 MOV DS,AX MOV AX,1234 MOV SI,0072 MOV SI,AX JMP FFFF:0 INT 20 -RCX 0014 -W -Q 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 9 页 - - - - - - - - -