[Intel汇编-MASM]Debug的使用
来源:互联网 发布:ubuntu 查看 主分区 编辑:程序博客网 时间:2024/04/29 21:50
1. bug和debug名词的由来:
1) 最早的计算机都是用电子管搭的,一次实验中因为电子管的光热引入一只小飞虫(bug)进入其真空结构内导致整个计算机瘫痪,废了科学家好长时间才排除了这个故障电子管,当时他们把这个排除故障的过程调侃为去除虫子(debug);
2) 现在人们将bug当做计算机系统、程序中的错误、漏洞和缺陷,而排除这些错误和漏洞的过程就叫debug,通常叫调试;
2. Windows古老的调试工具Debug简介:
1) 是DOS、Windows下的机器语言程序和汇编语言程序的调试工具;
2) 最初这款软件是工作在实模式下的(如果用户在调试过程中占用了其它正在运行的程序的内存空间(比如操作系统内核),则会对系统产生影响或导致那个正在运行的程序发生不可预料的错误,因此要求程序员对内存中那些段正在执行什么程序非常了解,程序员的压力非常巨大),但是现在基本上都是工作在保护模式下的,如果程序员占用了其它正在执行的程序的内存,就会被强行踢出(即拒绝执行这些命令);
3) 使用时直接在cmd控制台输入debug命令即可直接进入Debug程序;
注:64位系统需要自行下载一个32位的Debug放在DosBox虚拟机中运行!!!
i. Debug和cmd很像,也是通过使用命令对程序进行调试的;
ii. 在Debug中观察到的数据都用16进制表示!!!
**接下来介绍Debug中常用的命令
3. R——查看和改变寄存器中的内容:
1) Register的缩写,即寄存器,即用来查看以及修改寄存器中的值;
2) 查看:
i. R+回车;
ii. 会显示CPU各个寄存器中的值(16进制的);
iii. 最下面一行显示的是CS:IP指向的地址、该地址中的指令的16进制码以及相应的汇编语句形式;
!注意最后一行的第一个方框中的值就等于CS:IP中的值,后面的就是CS:IP指向的指令的机器码,第三个方框是相应的汇编代码;
3) 修改:
i. R 寄存器名+回车
接着输入改变后的数据(均是16进制的)+回车即可;
ii. 这样可以直接修改指定寄存器中的值;
!注:所有寄存器的值都可以使用这个命令修改,包括CS:IP;
4. D——查看内存中的内容:
1) Dump的缩写,倾倒的意思,可以形象地理解为将内存中的数据倾倒到屏幕上看看的意思;
2) 用该命令查看的内存中的数据将会以16进制和ASCII字符的形式显示;
查看方式(这里的查看方式是指指定查看的范围,是查看一大片区域呢还是查看一小段区间或是只查看一个值):
i. 不指定区间:D 段地址:偏移地址+回车
!注意:对于不同计算机相同地址中的值可能不同(内存中相同区域对应的存储空间不同),而对于同一台机器,可能因为时间不同,不同程序占用同一段空间,而导致同一地址中的内容不同;
!如果键入的地址不是16的整数倍,则左边的起始地址仍然是16的整数倍,只不过键入的地址之前的地址中的内容都不予以显示,显示的数据量仍然是128个,最后一行中超过128个的部分同样也不予以显示:
此时如果接着直接键入D+回车可以查看接着上次查看之后的128个数据:
ii. 指定区间:D 段地址:起始偏移地址 结尾偏移地址
iii. 只查看一个数据:利用指定区间的方法,将起始让起始偏移地址等于结尾偏移地址即可
5. E——以16进制形式改写内存中的内容:
1) Enter的缩写,即进入,可以理解为将修改的内容Enter进内存当中,但是我通常理解为Edit Memory,即编辑内存中的内容;
2) 只能输入16进制数据、字符和字符串,不能用字符串形式输入汇编命令,这样输入进去的将不会被看做指令,而只是看做组成指令的一个个ASCII字符;
i. 非提问方式修改:E 段地址:偏移地址(作为起始地址) 数据1 数据2 数据3 数据4 ……
!注意:字符串用双引号引起来,里面有多少个字符就按顺序占多少个字节,其中没有最后一位隐藏的空字符!!!单字符就用单引号引起来,数据不用引号,直接用16进制数表示,注意不能大于一个字节(比如123就是3位16进制数,超过一个字节),否则会报错;
!中间使用空格作为分隔符!!!
ii. 以提问的方式修改:E 段地址:偏移地址(作为起始地址)+回车
这是会提示你修改的起始地址,以及每个修改的字节的原始值,然后让你输入修改后的值,同样也是用空格作为分隔符,修改就输入修改后的值,不修改就直接键入空格修改下一个字节的值,修改完毕直接回车:
!注意:在此种模式下修改只能输入数据量而不能输入字符和字符串!!!
!!!注意:直接键入E命令将会报错,而不会接着上一次的修改继续;
6. U——将内存中的数据进行反汇编:
1) Unassemble的缩写,即反汇编的意思;
2) 不指定区间:
i. U 段地址:偏移地址(一起作为起始地址)+ 回车(同样也可以指定区间,这样就只显示指定区间内的反汇编内容)
ii. 会将从起始地址开始的连续的30多个字节中的数据反汇编成汇编指令,不管里面放的是指令还是数据都会硬着头皮强行翻译成汇编语言显示;
接着键入U+回车可以接着上一次查看继续往下查看(头一个地址接着上一次查询的最后一个地址):
iii. 指定区间查询:U 段地址:起始偏移地址 结尾偏移地址(该命令会将指定偏移区间的数据进行反汇编)
7. A——用汇编语言的形式将指令写入内存:
1) Assemble的缩写,即汇编,使用该命令可以直接往内存中写入汇编命令;
2) A 段地址:偏移地址(一起作为起始地址)+ 回车(不能指定区间,即使指定了区间,在输入汇编指令时也不会有任何限制,超界了就超界)
i. 从起始地址开始写汇编指令,写完一条就回车一下
ii. 写完之后再敲一下回车就会退出这个命令
!注:写进去的是汇编指令翻译后的机器码而不是命令的ASCII字符!!!
!写完之后再键入A+回车可以接着上次的地址往下写(不管中间执行了其它什么命令,比如中间执行的d 2000:0,之后再执行a还是会接着上次的1000:xxxx的位置开始继续);
8. T——执行当前CS:IP所指向的指令:
1) Trace的缩写,即追溯、沿路走的意思,可以理解为沿着CS:IP的指向走,即执行CS:IP所指向的指令;
2) T+回车,即可执行CS:IP所指向的指令,执行完毕后IP将加上刚刚执行指令的长度偏移到下一条指令,并且寄存器中的内容将会按照刚刚执行的指令发生变化;
**Debug小技巧补充:可以在命令U、D、A、E中使用段寄存器来定位段基,比如U CS:2000,但是偏移地址不能写寄存器,只能手写16进制数,此操作可以使操作简便!
- [Intel汇编-MASM]Debug的使用
- 汇编软件MASM和调试工具DEBUG的使用
- [Intel汇编-MASM]栈
- [Intel汇编-MASM]转移指令
- [Intel汇编-MASM]标志寄存器
- [Intel汇编-MASM]内中断
- [Intel汇编-MASM]端口通信
- [Intel汇编-MASM]外中断
- [Intel汇编-MASM]程序中可用的寄存器
- [Intel汇编-MASM]源程序的组成以及编译调试
- 汇编debug与masm命令
- 汇编中debug和Masm不同的处理方式
- 汇编汇编(MASM debug命令)
- [Intel汇编-MASM]与或以及乘除
- [Intel汇编-MASM]内存单元访问扩展
- [Intel汇编-MASM]嵌套循环问题
- [Intel汇编-MASM]内存访问方式以及循环程序的调试
- 64位win7使用debug(Masm所有子程序)的方法:
- DLL注入与卸载
- Unity学习感想
- 计算机是如何启动的?
- IOS 应用沙盒结构分析
- 利用fnd_flex_keyval包轻松获取关键性弹性域组合描述字段
- [Intel汇编-MASM]Debug的使用
- 这是我第一个博客
- 数组几种常见排序的javascript实现
- label显示不同字体
- css中的定位
- unity3d 实现夜视仪效果
- 从"按层次输出二叉树"到"求解二叉树深度"的总结
- 【AI插件】Adobe Illustrator工程与C++工程消息传递
- Python 内置函数sorted详解和itemgetter, attrgetter