[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进制数,此操作可以使操作简便!

0 0
原创粉丝点击