zoukankan      html  css  js  c++  java
  • 汇编——实验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命令修改内存单元的内容,支持单(双)引号,支持连续字符。

  • 相关阅读:
    LeetCode 1110. Delete Nodes And Return Forest
    LeetCode 473. Matchsticks to Square
    LeetCode 886. Possible Bipartition
    LeetCode 737. Sentence Similarity II
    LeetCode 734. Sentence Similarity
    LeetCode 491. Increasing Subsequences
    LeetCode 1020. Number of Enclaves
    LeetCode 531. Lonely Pixel I
    LeetCode 1091. Shortest Path in Binary Matrix
    LeetCode 590. N-ary Tree Postorder Traversal
  • 原文地址:https://www.cnblogs.com/zjybel/p/9863586.html
Copyright © 2011-2022 走看看