• 汇编——实验1


    下面是第一次汇编实验的具体内容以及我的收获。

    首先,是实验任务的具体操作以及相关说明。

    实验任务(1):使用debug,将下面的程序段写入内存,逐条执行,观察每条指令执行后CPU中相关寄存器中内容的变化。

    具体操作:1)尝试用e命令修改内存单元里的内容,我首先调用了d命令查看原来内存单元的初始内容,接着,调用e命令将内存单元原先的值修改为题中所给的数据。最后再次调用d命令查看此时内存单元中的内容是否发生改变,同时调用u命令查看此时的汇编指令。(在这里我进行修改的内存单元地址就是原先CS:IP指向的地址。)

                                                                                 (——调用e命令修改)

                                                                                               (——调用u命令查看汇编指令)

    2)尝试用a命令以汇编指令的形式在内存中写入机器指令。首先调用a命令将汇编指令写入,其次,调用t命令单步调试该程序段,最后我调用了d命令查看此时的内存单元里的内容是否发生了相应的改变。

                                                                                                      (——调用a命令写入汇编指令)

                                                 ...       

    (——调用t命令单步调试该程序段,此处由于单步调试的次数过多,故截图时省略了中间单步调试的过程)

                                                                        (——调用d命令查看此时内存单元内容)

    实验任务(2):将下面3条指令写入从2000:0开始的内存单元中,利用这3条指令计算2的8次方。

    具体操作:这里主要考察修改寄存器CS与IP的值。由于语句3 JMP 2000:0003,将IP的值修改为0003,与语句2构成一个循环,此时要计算2的8次方只需要知道要循环多少次即可。同时最后的结果将保存在ax寄存器中。

                                            

                                                                                         (——实现2的8次方)

    同时在这里我遇到了一个问题,t命令后面可以直接跟单步执行的次数,我根据单步调试得出计算2的8次方一共需要单步调试16次,然后我就想先调试一次给出CS与IP此时的值后直接连续单步调试15次,就出现了如下的情况:(已经超过了2的8次方,当我连续单步调试10次时方出现2的8次方的值,不知道是为什么?)

                           

                    (???question)

    实验内容(3):查看内存中的内容。在内存FFF00H~FFFFFH的某几个单元中,找到生产日期并试图改变它。

    具体说明:该实验中主要要注意

    1)如何将用CS、IP的值指向物理地址。(有多种方法);

    2)如何用d命令查看内存中的内容;

    3)该段内存地址在8086CPU中具体是哪一块内存地址分配空间。

           

    由图可见,试图改变表示日期的内存单元的内容却改不了,这主要和CPU内存地址空间分配的情况有关,

    如图所示,在8086CPU机内存地址空间分配中,FFF00H~FFFFFH是各类ROM地址空间,此时向FFF00H~FFFFFH的内存单元中写入数据的操作是无效的,因为这等于只改写只读存储器中的内容。

    实验任务(4):向内存从B810H开始的单元中填写数据,观察产生的现象,在改写填写的地址,观察产生的现象。

    具体操作:1)首先调用e命令修改内存单元,修改偏移地址为0000,0002,0004,0006的内存单元内容,观察其产生的现象。

    2)在此基础上,修改偏移地址为0001,0003,0005,0007的内存单元内容,观察其变化。

    3)改变地址,向内存从2000:0开始的单元中填写数据,观察其有何变化。

    (——调用e命令修改内存单元的内容)

    (——查看修改后从2000:0到2000:0007的内存地址中存放的值)

    这与实验任务(3)是一样的原理,只不过在8086CPU机内存地址空间分配中,内存从B810H到BFFFH 是显存地址空间,用e命令修改的是显存,故而会在屏幕上显示出类似爱心,笑脸的图形。根据观察还可以发现,修改偏移地址为0000,0002,0004,0006的内存内容,出现的是图案,当在此基础上修改偏移地址为0001,0003,0005,0007的内存内容,会发生颜色变化。这真是一件神奇的事情!

    具体的实验操作就是上述的这么多了,接下来说说我的收获与体会。在本次试验中我对于a,d,e,r,u,t等命令有了更深入的认识,其中给我印象最深,也是比较容易出现error的就是t命令、g命令、u命令。由于它们的用法比较多,所以比较容易搞混。下图是debug中的一些命令用法,可以看出调用g,t,p命令时address的前面有等号,其他则没有,在使用时要格外注意这一点。

    举例来说,调用t命令时,有3种用法。(1)t后面不带参数,-t即表示从当前CS:IP开始单步调试一次,(2)t后面带参数,-t=2000:0即表示从CS为2000,IP为0的地址开始单步调试一次,(此时即不在默认CS:IP所指地址位置进行调试,若想要让t不带参数,也可以修改CS与IP的值)(3)t后面带参数,-t=2000:0 5即表示从CS为2000,IP为0的地址开始连续单步调试5次。

    调用g命令时,若要确定调试的范围,应这样写-g=0:200 0:208(后一个地址要写全,不能只写偏移地址),同时还需注意g命令的另一种用法,-g 208 ,该条语句的意思是从当前CS与IP所指的地址开始执行到CS:207(不包括偏移地址为208的内存单元)。

    与此不同的是u即反汇编指令,它有3种用法,(1)-u 0:200 208即从0:200执行到0:208结束(是包括偏移地址为208的内存单元),(2)-u 0:200 l9即从0:200开始连续反汇编9个字节结束,(3)-u 0:200即从0:200开始连续反汇编32个字节结束。

     还有e命令,我觉得也要注意一下它的用法。e命令修改内存单元的内容,支持单(双)引号,支持连续字符。

  • 相关阅读:
    GCD实现多个定时器,完美避过NSTimer的三大缺陷(RunLoop、Thread、Leaks)
    iOS适配UIViewView/WKWebView,H5生成长图,仿微信进度条
    翻译jquery官方的插件制作方法
    javascript引用和赋值
    薯片公司真实JS面试题(乐视TV)
    caller、call、apply、callee的用法和意思
    常用javascript类型判断
    Git 常用命令笔记(不定期持续记录)
    sublime text2 emmet 安装
    hash"#"
  • 原文地址:https://www.cnblogs.com/zjybel/p/9863586.html
Copyright © 2020-2023  润新知