(分享)详解debug命令
- 格式:doc
- 大小:86.00 KB
- 文档页数:24
五、DEBUG调试程序DEBUG.EXE程序是专门为分析、研制和开发汇编语言程序而设计的一种调试工具,具有跟踪程序执行、观察中间运行结果、显示和修改寄存器或存储单元内容等多种功能。
它能使程序设计人员或用户触及到机器内部,因此可以说它是80X86CPU的心灵窗口,也是我们学习汇编语言必须掌握的调试工具。
1)DEBUG程序使用在DOS提示符下键入命令:C>DEBUG [盘符:][路径][文件名.EXE][参数1][参数2]这时屏幕上出现DEBUG的提示符“-”,表示系统在DEBUG管理之下,此时可以用DEBUG 进行程序调试。
若所有选项省略,仅把DEBUG装入内存,可对当前内存中的内容进行调试,或者再用N和L命令,从指定盘上装入要调试的程序;若命令行中有文件名,则DOS把DEBUG 程序调入内存后,再由DEBUG将指定的文件名装入内存。
2)DEBUG的常用命令(1)汇编命令A格式:A[起始地址]功能:将输入源程序的指令汇编成目标代码并从指定地址单元开始存放。
若缺省起始地址,则从当前CS:100地址开始存放。
A命令按行汇编,主要是用于小段程序的汇编或对目标程序的修改。
(2)反汇编命令U格式1:U[起始地址]格式2:U[起始地址][结束地址|字节数]功能:格式1从指定起始地址处开始将32个字节的目标代码转换成汇编指令形式,缺省起始地址,则从当前地址CS:IP开始。
格式2将指定范围的内存单元中的目标代码转换成汇编指令。
(3)显示、修改寄存器命令R格式:R[寄存器名]功能:若给出寄存器名,则显示该寄存器的内容并可进行修改。
缺省寄存器名,则按以下格式显示所有寄存器的内容及当前值(不能修改)。
AX=0000 BX=0004 CX=0020 DX=0000 SP=0080 BP=0000 SI=0000DI=0000 DS=3000 ES=23A0 CS=138E IP=0000NV UP DI PL NZ NA PO NC138E:0000 MOV AX,1234-R AX ;输入命令AX 0014 ;显示AX的内容:;供修改,不修改按回车。
debug命令DEBUG命令参数详解DEBUG是一个DOS实用程序,是供程序员使用的程序调试工具,可以用它检查内存中任何地方的字节以及修改任何地方的字节。
它可以用于逐指令执行某个程序以验证程序运行的正确性,也可以追踪执行过程、比较一个指令执行前后的值以及比较与移动内存中数据的范围,读写文件与磁盘扇区。
它的功能包括以下几个方面。
1,直接输入,更改,跟踪,运行汇编语言源程序;2,观察操作系统的内容;3,查看ROM BIOS的内容;4,观察更改RAM内部的设置值;5,以扇区或文件的方式读写软盘数据DEBUG把所有数据都作为字节序列处理。
因此它可以读任何类型的文件。
DEB UG可以识别两种数据: 十六进制数据和ASCⅡ码字符。
它的显示格式是各个字节的十六进制值以及值在32与126之间的字节的相应ASCⅡ码字符。
在DEBUG中输入数据有两种方法: 提示方法和非提示方法。
在用提示方法时,用户可以输入要求输入数据的命令,后跟数据所要输入的地址。
然后用户就可以看到该地之中已有内容及一个冒号提示符。
此时用户可以在提示符下输入一个新的值或者按下回车键或CTRL+C回到短横(-)提示符。
在运用非提示方法时,用户可以输入要输入数据的内存地址以及要输入的字节。
但与使用字处理程序或正文编辑程序时不一样,在使用DEBUG时,用户不能直接移动光标到一入口点输入或修改数据,而要一次输入一个或几个字节。
在使用DEBUG时可以只涉及内存中的数据,从而一般都要指定所要处理的内存地址,地址的输入格式是: [段地址]: [位移]。
如果没有输入地址,DEBUG将假定为当前内存段,从位于地址100H的字节开始。
前100H字节保留给程序段前缀使用,这一专用区域用于建立DOS与程序之间的联系。
DEBUG总是用四位十六进制数表示地址。
用两位数表示十六进制数据。
讲到这里大家应该对DEBUG有了初步的了解,但是光知道这些可不够,接下来我来讲讲DEBUG的命令格式和命令。
DEBUG命令大全(看看有啥用)a) 常用DOS命令1) 查看目录命令DIR,它列出所指盘上的文件目录,如:C>DIR D:2) 拷贝命令COPY,它把一个或多个文件拷贝成副本,如:C>COPY EX1.EXE D:3) 改变当前目录,格式为:C>CD 目录名4) 退出子目录,格式为:C>CD .. ,将退出当前子目录到直接外层目录下。
b) 熟悉DEBUG的使用方法,运行各种命令,观察运行后的情况1.DEBUG程序的调用在DOS提示符下,可键入命令:C>DEBUG [d:][path][文件名]其中文件名是被调试交件的名字,它须是执行文件(EXE),在DEBUG程序调入后,出现提示符"一",此时,可键入所需的DEBUG命令.2.DEBUG的主要命令〈1〉显示内存单元内容的命令D,格式为-D[地址]或-D[范围](2)修改内存单元内容的命令E,它有两种格式1) 给定的内容代替指定范围的单元内容一E地址内容表例如其中FLWX"'"Y""'Z"和8D各占一个字节,用这五个字节代替原内存单元内容,HXH,句""'Z"将分别按它们的ASCII码值代入。
2〉逐个单元相继地修改:-E地址例如一E 10018E4:0100 89.78此命令是将原100号单元的内容89改为78。
78是程序员键入的(3)检查和修改寄存器内容的命令R,它有三种方式1〉显示CPU内部所有寄存器内容和标志位状态,格式为-RR命令显示中标志位状态的含义如下表所示标志名置位复位溢出overflow方向direction中断interrupt符号sign零zero辅助进位auxiliary carry奇偶parity进位carry OVDNEINGZRACPECY NVUPDIPLNZNAPONC2)显示和修改某个指定寄存器内容,格式为一R寄存器名例如打入: -R AX系统将响应如下:AX F1F4:表示AX当前内容为FlF4,此时若不对其作修改,可按ENTER键,否则,打入修改后内容,如:-R BXBX 0369:059F则BX内容由0369改为059F3)显示和修改标志位状态,命令格式为-RF系统将给出响应,如OV DN EI NG ZR AC PE CY一这时若不作修改可按ENTER键,否则在"一'号之后键入修改值,键入顺序任意。
命令行参数形式:格式:DEBUG [[驱动器号:][路径]文件名[调试参数]]用途:debug将所指定文件装入内存,显示提示符“-”等待进一步命令。
若装入文件为.exe文件,按照重定位原则装入为可执行状态。
.com文件类似。
若为其它类型文件则直接进行内存映射,由偏移量100H原封不动读入内存。
debug将在缓冲区为被调试程序建立适当的PSP(程序段前缀,Program Segment Prefix)。
在PSP中的偏移量80H为命令行的末尾。
而且在偏移量5CH和6CH由包含参数后面的可选参数构成缺省的FCB(文件控制块,File Control Block)。
进入时各寄存器初使情况:寄存器.com程序.exe程序AX 指定驱动器错误码指定驱动器错误码BX 程序空间的高地址程序空间的高地址CX 程序空间的低地址程序空间的低地址DX 0 0 SI 0 0DI 0 0BP 0 0SP 0FFFFH或可利用的不定内存空间上限减2IP 100H 目标程序的的代码入口偏移量CS PSP 目标程序代码段址DS PSP PSPCS PSP PSPSS PSP 目标程序堆栈段底命令:A: 编写汇编代码(Assemble)格式:A[地址]用途:程序允许在指定位置(若无缺省为IP指针位置)进行汇编程序书写。
细节:*所有数值皆为十六进制整数,数值后不带“H”*不支持文件管理用的目录表、宏标记、条件汇编*跳转指令后要直接书写十六进制地址不支持标号*数据类型若非默认类型,要以PTR加以指定*字符串操作要指定类型为B或W(如lodsb和lodsw等)及长度*用DB和DW接受数据定义,直按进行汇编*对内存地址加[]以与立即数区分C: 内存内容比较(Compare)格式:C 地址范围地址地址范围:做比较的第一个内存域始未地址或始地址和长度地址:做比较的第二个内存域的始地址用途:*对内存中两个域的内容加以比较,以字节为单位。
对发现有差别的内容及其地址用如下形式显示出:地址1 始位置未位置地址2*若地址范围或地址不含段地址,默认为DS的值。
一、DEBUG的主要命令A命令功能: 将助记符指令转换为机器指令码存储在指定的内存单元,即汇编过程格式1: Axxxx:0100 助记符指令1(ENTER)xxxx:xxxx 助记符指令2(ENTER)……xxxx:xxxx ENTER结束功能: 逐次将助记符指令对应的指令码存入从CS: 0100h起的连续的内存单元格式2:A 起始地址start-addrxxxx:0100 助记符指令1(ENTER)xxxx:xxxx 助记符指令2(ENTER)……xxxx:xxxx ENTER结束功能: 逐次将助记符指令对应的指令码存入从CS: star-addr起的连续的内存单元注: 指令中可以包含数据定义伪指令DB/DW等语句D命令功能: 查看指定内存单元的内容格式1: D [起始地址start-addr [L长度length]]功能: 显示从起始地址start-addr开始的length个字节,省略start-addr时从DS:0100h开始,省略长度length时默认值为80H(128)注: start-addr可以为偏移地址, 此时其默认的段基址为DS;也可以显式地按段地址:偏移地址格式指明完整的逻辑地址, 段地址不一定是段寄存器, 还可以是任意16位地址格式2: D[起始地址start-addr 终结地址end-addr]功能: 显示从起始地址start-addr开始到结束地址end-addr之间的字节注: start-addr和end-addr同时为偏移地址时默认的段基址为DS;start-addr采用段地址:偏移地址格式指明时, end-addr可以不必再指明段地址, 直接以偏移地址形式给出(start-addr和end-addr的段地址始终相同);当start-addr和end-addr的偏移地址相同时只显示该存储单元的字节.E命令功能: 修改指定内存单元的内容格式1: E 起始地址start-addr 字节数据1 字节数据2 … 字节数据n功能: 逐次用后面的字节数据修改从起始地址起的连续内存单元的内容格式2: E 起始地址start-addr(按ENTER)起始地址该内存单元的原值.待输入新值/空格键功能:在提示情况下逐个修改从起始地址start-addr开始的字节数据的值, 输入空格表示不做修改, 直至输入ENTER键结束G命令功能: 执行正在调试的汇编程序至指定的断点格式: G [start-addr] break-addr1[, break-addr2, …]功能:star-addr是指令码的起始偏移地址, break-addr是断点处的偏移地址, 段地址均为CS, 可以指定多个断点位置P命令功能: 执行INT, CALL, LOOP及重复串指令(REP等)直至下一条指令格式: P [start-addr] [n]功能:star-addr是待执行指令码的起始偏移地址, n是往下执行指令的条数Q命令功能: 退出debug格式: QR命令功能:显示和修改寄存器的内容格式1:R;显示所有寄存器的内容格式2: R 寄存器名;显示指定寄存器的值, 再按ENTER后键入数值可修改该寄存器的值格式3:R F;显示标志寄存器中各标志位的值标志位符号的意义如下:标志位符号意义标志位1标志位0OF 溢出(是/否) OV NVDF 方向(减/增) DN UPIF 中断(允许/关闭)EI DISF 符号(负/正) NG PLZF 零(是/否) ZR NZAF 辅助进位(是/否)AC NAPF 奇偶(偶/奇) PE POCF 进位(是/否) CY NCT命令功能: 以单步方式执行指定的指令代码格式1: T功能: 以单步方式执行从CS:IP开始的1条指令格式2: T 指令条数n功能: 以单步方式执行从CS:IP开始开始的n条指令U命令功能: 将内存单元的机器指令码转换为助记符指令,即反汇编过程格式1: U 起始地址start-addr功能: 将从start-addr开始的32个字节的指令码转换为助记符格式2: U 起始地址start-addr终结地址end-addr功能: 将从start-addr开始至终结地址end-addr之间的指令码转换为助记符二、DEBUG的相关说明1.debug默认所有的数值都是16进制的,且无需在最后添加后缀h;2.debug不区分字母的大小写;3.快捷键: F1键--逐个重复前一条命令的字符,F3键--重复前面整条命令;4.在dos系统中文件名的最大长度为8个字符,扩展名的最大长度为3个字符.在给asm文件命名时若超过8个字符,虽然可以编译生成obj文件但在连接时却生成不了exe文件,从而引发一些错误.注意文件名不要超过8个字符;5.对于32位指令,debug并不显示其助记符,而是会以DB开头显示,这与数据定义伪指令不同;6.在[EA](EA为常数)作操作数时(如MOV 寄存器,[EA]和MOV [EA],寄存器),若不在[EA]前加段前缀, 则debug会将其视为常数EA而非偏移地址,此时必须显式指明段前缀.三、用DEBUG调试程序1.顺序指令的调试调试程序的指令格式路径>debug filename.exe接着可用R指令查看各寄存器的值, 说明如下:1)CX的值为整个程序的指令码的字节总数;2)CS:IP指向第一条指令, (CS)=(DS)+10h, (IP)=0000h, 这是因为程序在内存中的起始地址是DS:0000h,但前256个字节单元用于PSP,所以从(CS+10h): 0000h才是程序的指令码.用U命令可以查看程序的助记符指令下面以程序test.asm为例说明, 其源代码如下:.model small.databuff db 2 dup(?).codestart:mov ax,@datamov ds,axmov ax,100mov bl,3div blmov buff,almov buff+1,ahmov ah,4chint 21hend start可知数据段的段基址为1450h, 而buff内存的偏移地址为0008h, 从144F:00~144F:16都是源程序的机器码, 共计17个字节再接着可用T命令单步调试每单步执行一条指令, 都会显示执行指令后的寄存器的内容注意IP的变化代表了上一条指令的机器码长度下面执行3条指令, 如下所示:可以看到进行除法运算后AL=21h=33(商), AH=1h(余数), 同时提示下一条指令为: MOV [0008H], AL这里偏移量0008h就是buff的偏移量, 同时右下角显示了该内存单元的当前内容为14h上面在执行完商和余数的MOV指令后, 用D指令查看buff及其后一个单元的内容, 分别是商21h及余数1h, 程序执行完全正确.最后在单步执行INT 21H指令时要用P指令, 此时会显示程序正常结束字样!2.循环结构的调试以testloop.asm为例:.model small.databuff dw ?.codestart:mov ax,@datamov ds,axmov cx,9mov ax,2again:add ax,axloop againmov buff,axmov ah,4chint 21hend start对循环结构的调试方法是:只需调试2~3次循环即可确定循环逻辑是否正确,接着可让程序直接执行到循环结束,然后再单步调试.让程序执行到某个断点位置: G命令断点偏移地址让程序执行到循环结束: 在调试LOOP指令时使用P命令。
DEBUG的命令及功能1. A(assemble):将指令转换成机器码并存储到内存中。
-A100:在内存地址100处开始输入指令。
2. D(dump):显示内存中的内容。
-D100200:显示内存地址从100到200的内容。
3. E(enter):修改内存中的数据。
-E1004000:在内存地址100处将数据修改为40。
4. G(go):执行程序。
-G100:从内存地址100处开始执行程序。
6. Q(quit):退出DEBUG。
-Q:退出DEBUG程序。
7. R(registers):显示和修改CPU寄存器的值。
-R:显示所有寄存器及其值。
-RAX1234:将AX寄存器的值修改为12348. T(trace):单步跟踪程序的执行。
-T:执行下一条指令并停止。
9. P(proceed):继续执行程序直至下一个断点或程序结束。
-P:继续执行程序。
10. U(unassemble):将机器码转换成指令。
-U100120:从内存地址100处开始将机器码转换成指令。
11. B(breakpoint):设置断点。
-B100:在内存地址100处设置断点。
12. S (search):在内存中指定的内容。
- S 100 200 "Hello": 在内存地址100到200之间字符串"Hello"。
13. L(load):加载程序到内存中。
-L100:从内存地址100处加载程序。
14. W(write):将内存中的数据写入文件。
- W 100 200 file.txt: 将内存地址100到200的数据写入到文件file.txt。
15. M(move):将内存中的数据移动到指定的地址。
-M100200300:将内存地址100到200的数据移动到地址300处。
16. X (execute):执行子程序。
-X100:从内存地址100处执行子程序。
17. H(help):显示DEBUG命令的帮助信息。
Debug命令详解Debug:A(汇编)Debug:C(比较)Debug:D(转储)Debug:E(键入)Debug:F(填充)Debug:G(转向)Debug:H(十六进制)Debug:I(输入)Debug:L(加载)Debug:M(移动)Debug:N(名称)Debug:O(输出)Debug:P(执行)Debug:Q(退出)Debug:R(寄存器)Debug:S(搜索)Debug:T(跟踪)Debug:U(反汇编)Debug:W(写入)Debug:XA(分配扩展内存)Debug:XD(释放扩展内存)Debug:XM(映射扩展内存页)Debug:XS(显示扩展内存状态)Debug命令详解Debug:A(汇编)直接将 8086/8087/8088 记忆码合并到内存。
该命令从汇编语言语句创建可执行的机器码。
所有数值都是十六进制格式,必须按一到四个字符输入这些数值。
在引用的操作代码(操作码)前指定前缀记忆码。
a [address]参数address指定键入汇编语言指令的位置。
对address 使用十六进制值,并键入不以“h”字符结尾的每个值。
如果不指定地址,a 将在它上次停止处开始汇编。
有关将数据输入到指定字节中的信息,请参看Debug E(键入)。
有关反汇编字节的信息,请参看Debug U(反汇编)说明使用记忆码段的替代记忆码为 cs:、ds:、es: 和 ss:。
远程返回的记忆码是 retf。
字符串处理的记忆码必须明确声明字符串大小。
例如,使用movsw 可以移动 16 位的字串,使用 movsb 可以移动 8 位字节串。
汇编跳转和调用汇编程序根据字节替换自动将短、近和远的跳转及调用汇编到目标地址。
通过使用near 或far 前缀可以替代这样的跳转或调用,如下例所示:-a0100:05000100:0500 jmp 502 ; a 2-byte short jump0100:0502 jmp near 505 ; a 3-byte near jump0100:0505 jmp far 50a ; a 5-byte far jump可以将 near 前缀缩写为 ne。
DEBUG调试程序的使用一、DEBUG的启动在DOS系统提示符下,运行DEBUG命令即可启动。
命令格式:DEBUG [文件名全称]功能:启动DEBUG调试程序,并把指定名字的文件装载入内存,以供调试。
说明:启动DEBUG,实际就是让计算机执行DEBUG.EXE这个调试程序。
若该程序不在当前目录下,需要在命令中指定该程序所在的位置路径(包括其所在磁盘和文件夹)。
文件名全称指定要调试的文件名及其所在的位置路径。
若指定该选项,则在启动DEBUG时把该文件装载入内存,以供调试,该文件一般是EXE文件或COM文件。
若不指定该选项,则只启动DEBUG,不装载文件。
二、DEBUG常用命令1、D——显示内存单元内容的命令格式:D[开始地址[结束地址]]说明:①若“开始地址”和“结束地址”都指定,则显示指定地址范围内的内存单元的内容;若只指定“开始地址”,省略“结束地址”,则显示从“开始地址”开始的80H个字节的内容;若“开始地址”和“结束地址”都省略,则显示从上次显示的末字节单元的下一个字节开始的80H个字节的内容。
②“开始地址”可包含段地址,若省略段地址,则默认使用DS的值作段地址。
2、E——输入内容(修改内存单元内容)命令格式:E开始地址[数据表列]说明:①若指定数据表列,则用数据表列中的数据存入从指定地址开始的内存单元中;若省略数据表列,则先显示指定开始地址的内存单元的内容,等待你修改。
若需要修改,输入其内容,按空格键显示、修改下一个内存单元内容;若不需要修改,直接按空格键显示、修改下一个内存单元内容,修改完成后按回车键。
②“开始地址”可包含段地址,若省略段地址,则默认使用DS的值作段地址。
3、F——填充内容(修改内存单元内容)命令格式:F开始地址结束地址数据表列说明:①用数据表列中的数据存入由开始地址和结束地址指定范围内的内存单元。
若数据表列中的数据少于指定地址范围的内存单元数,则循环使用表列中的数据存入内存单元,若数据表列中的数据多于指定地址范围的内存单元数,则多余的数据被忽略。
Debug启动Debug,他是可用于测试和调试MS-DOS 可执行文件的程式。
Debug [[drive:][path] filename [parameters]]参数[drive:][path] filename指定要测试的可执行文件的位置和名称。
parameters指定要测试的可执行文件所需要的所有命令行信息。
++说明使用Debug 命令但不指定要测试的文件如果使用没有位置和文件名的Debug 命令,然后键入所有的Debug 命令以响应Debug 提示符,连字符(-)。
Debug 命令以下是Debug 命令列表:? 显示Debug 命令列表。
a 汇编8086/8087/8088 记忆码。
c 比较内存的两个部分。
d 显示部分内存的内容。
e 从指定地址开始,将数据输入到内存。
f 使用指定值填充一段内存。
g 运行在内存中的可执行文件。
h 执行十六进制运算。
i 显示来自特定端口的1 字节值。
l 将文件或磁盘扇区内容加载到内存。
m 复制内存块中的内容/n 为l 或w 命令指定文件,或指定正在测试的文件的参数。
o 向输出端口发送1 个字节的值。
p 执行循环、重复的字符串指令、软件中断或子例程。
q 停止Debug 会话。
r 显示或改动一个或多个寄存器。
s 在部分内存中搜索一个或多个字节值的模式。
t 执行一条指令,然后显示所有寄存器的内容、所有标志的状态和Debug 下一步要执行的指令的解码形式。
u 反汇编字节并显示相应的原语句。
w 将被测试文件写入磁盘。
xa 分配扩展内存。
xd 释放扩展内存。
xm 映射扩展内存页。
xs 显示扩展内存的状态。
分隔命令参数所有Debug 命令都接受参数,除了q 命令之外。
能用逗号或空格分隔参数,不过只有在两个十六进制值之间才需要这些分隔符。
因此,以下命令等价:dcs:100 110d cs:100 110d,cs:100,110指定有效地址项Debug 命令中的address 参数指定内存位置。
Address 是个包含字母段记录的二位名称或一个四位字段地址加上一个偏移量。
能忽略段寄存器或段地址。
a,g,l,t,u 和w 命令的默认段是CS。
所有其他命令的默认段是DS。
所有数值均为十六进制格式。
有效地址如下:CS:010004BA:0100在段名和偏移量之间要有冒号。
指定有效范围项Debug 命令中的range 参数指定了内存的范围。
能为range 选择两种格式:起始地址和结束地址,或起始地址和长度范围(由l 表示)。
中国.网管联盟例如,下面的两个语法都能指定从CS:100 开始的16 字节范围:cs:100 10fcs:100 l 10++Debug 子命令选择Debug 命令以获得周详信息。
Debug:A(汇编)Debug:C(比较)Debug(转储)Debug:E(键入)Debug:F(填充)Debug:G(转向)Debug:H(十六进制)Debug:I(输入)Debug:L(加载)Debug:M(移动)Debug:N(名称)Debug:O(输出)Debug:P(执行)Debug:Q(退出)Debug:r(寄存器)Debug:s(搜索)Debug:T(跟踪)Debug:U(反汇编)Debug:W(写入)Debug:XA(分配扩展内存)Debug:XD(取消分配扩展内存)Debug:XM(映射扩展内存页)Debug:XS(显示扩展内存状态)***********************Debug子命令******************************Debug:A(汇编)直接将8086/8087/8088 记忆码合并到内存。
该命令从汇编语言语句创建可执行的机器码。
所有数值都是十六进制格式,必须按一到四个字符输入这些数值。
在引用的操作代码(操作码)前指定前缀记忆码。
a [address]参数address指定键入汇编语言指令的位置。
对address 使用十六进制值,并键入不以“h”字符结尾的每个值。
如果不指定地址,a 将在他上次停止处开始汇编。
bitsCN_com有关将数据输入到指定字节中的信息,请单击“相关主题”列表中的Debug E(键入)。
有关反汇编字节的信息,请单击“相关主题”列表中的Debug U(反汇编)。
范例a 命令支持所有形式的间接注册命令,如下例所示:add bx,34[bp+2].[si-1]pop [bp+di]push [si] )还支持所有操作码同义词,如下例所示:loopz 100loope 100ja 200jnbe 200对于8087 操作码,必须指定wait 或fwait 前缀,如下例所示:fwait fadd st,st(3) ; this line assembles; an fwait prefix说明使用记忆码段的替代记忆码为cs:、ds:、es: 和ss:。
远程返回的记忆码是retf。
字符串处理的记忆码必须明确声明字符串大小。
例如,使用movsw 能移动16 位的字串,使用mov***(文字因故被系统屏蔽)***(文字因故被系统屏蔽)能移动8 位字节串。
汇编跳转和调用汇编程式根据字节替换自动将短、近和远的跳转及调用汇编到目标地址。
通过使用near 或far 前缀能替代这样的跳转或调用,如下例所示:-a0100:05000100:0500 jmp 502 ; a 2-byte short jump0100:0502 jmp near 505 ; a 3-byte near jump网管论坛0100:0505 jmp far 50a ; a 5-byte far jump能将near 前缀缩写为ne。
区分字和字节内存位置当某个操作数能引用某个字内存位置或字节内存位置时,必须用前缀word ptr 或前缀byte ptr 指定数据类型。
可接受的缩写分别是wo 和by。
以下范例显示两种格式:dec wo [si]neg byte ptr [128]指定操作数Debug 使用包括在中括号([ ]) 的操作数引用内存地址的习惯用法。
这是因为另一方面Debug 不能区分即时操作数和内存地址的操作数。
以下范例显示两种格式:mov ax,21 ; load AX with 21hmov ax,[21] ; load AX with the; contents of; memory location 21h使用伪指令使用 a 命令提供两个常用的伪指令:db 操作码,将字节值直接汇编到内存,dw 操作码,将字值直接汇编到内存。
以下是两个伪指令的范例:db 1,2,3,4,"THIS IS AN EXAMPLE"db THIS IS A QUOTATION MARK:"db "THIS IS A QUOTATION MARK:"dw 1000,2000,3000,"BACH"++Debug:C(比较)比较内存的两个部分。
c range address参数range指定要比较的内存第一个区域的起始和结束地址,或起始地址和长度。
有关有效的range 值的信息,请单击“相关主题”列表中的“Debug 说明”。
address指定要比较的第二个内存区域的起始地址。
有关有效address 值的信息,请单击“相关主题”列表中的“Debug 说明”。
++范例以下命令具有相同效果:c100,10f 300c100l10 300每个命令都对100h 到10Fh 的内存数据块和300h 到30Fh 的内存数据块进行比较。
Debug 响应前面的命令并显示如下信息(假定DS = 197F):197F:0100 4D E4 197F:0300197F:0101 67 99 197F:0301197F:0102 A3 27 197F:0302197F:0103 35 F3 197F:0303197F:0104 97 BD 197F:0304197F:0105 04 35 197F:0305197F:0107 76 71 197F:0307197F:0108 E6 11 197F:0308197F:0109 19 2C 197F:0309197F:010A 80 0A 197F:030A197F:010B 36 7F 197F:030B197F:010C BE 22 197F:030C197F:010D 83 93 197F:030D197F:010E 49 77 197F:030E197F:010F 4F 8A 197F:030F注意列表中缺少地址197F:0106 和197F:0306。
这表明那些地址中的值是相同的。
++说明如果range 和address 内存区域相同,Debug 将不显示所有内容而直接返回到Debug 提示符。
如果有差异,Debug 将按如下格式显示: address1 byte1 byte2 addess2Debug(转储)显示一定范围内存地址的内容。
d [range]参数range指定要显示其内容的内存区域的起始和结束地址,或起始地址和长度。
有关有效的range 值的信息,请单击“相关主题”列表中的“Debug 说明”。
如果不指定range,Debug 程式将从以前 d 命令中所指定的地址范围的末尾开始显示128 个字节的内容。
有关显示寄存器内容的信息,请单击“相关主题”列表中的Debug R(寄存器)。
++范例假定键入以下命令:dcs:100 10fDebug 按以下格式显示范围中的内容:04BA:0100 54 4F 4D 00 53 41 57 59-45 52 00 00 00 00 00 00 TOM.SAWYER......如果在没有参数的情况下键入 d 命令,Debug 按以前范例中所描述的内容来编排显示格式。
显示的每行以比前一行的地址大16 个字节(如果是显示40 列的屏幕,则为8 个字节)的地址开头。
对于后面键入的每个不带参数的 d 命令,Debug 将紧接在最后显示的命令后即时显示字节内容。
如果键入以下命令,Debug 将从CS:100 开始显示20h 个字节的内容:dcs:100 l 20如果键入以下命令,Debug 将显示范围从CS 段的100h 到115h 中所有字节的内容:网管软件下载dcs:100 115++说明当使用 d 命令时,Debug 以两个部分显示内存内容:十六进制部分(每个字节的值都用十六进制格式表示)和ASCII 码部分(每个字节的值都用ASCII 码字符表示)。
每个非打印字符在显示的ASCII 部分由句号(.) 表示。
每个显示行显示16 字节的内容,第8 字节和第9 字节之间有一个连字符。