• 汇编——实验2


    实验2的任务相对较少,但是在预备知识中补充了一些新的概念和一个新的名词:中断机制。

    首先,在预备知识部分主要介绍了两大块内容。

    1.是在D,E,A,U命令中使用段寄存器;

    由之前所学到的知识可得调用d命令时,会出现"-d 段地址:偏移地址"的格式,由此引申出Debug在处理D命令的程序段中,必有将段地址送入段寄存器的代码,由CPU来执行这一段程序。而这一段寄存器就是ds段寄存器。同时D命令也提供了一种符合CPU机理的格式:"d 段寄存器:偏移地址"。例如:

    -r ds
    :1000
    -d ds:0      ;查看从1000:0开始的内存区间中的内容
    -r ds
    :1000
    -d ds:10 18       ;查看1000:10~1000:18中的内容

    同样的,E,U,A命令中也可以直接用段寄存器表示内存单元的段地址。见代码:

    -r ds
    :1000
    -e ds:0 11 22 33 44 55 66         ;在从1000:0开始的内存区间上写入数据
    
    
    
    -r ds
    :1000
    -u ds:0              ;以汇编指令的形式显示当前代码段中的代码
    
    
    
    -r ds
    :1000
    -a ds:0        ;以汇编指令的形式,向从1000:0开始的内存单元中写入指令

    2.是有关debug的T命令在执行修改SS得指令时出现的特殊情况(在这里引入了一个新的名词:中断机制)。

    这也与之后的实验任务(2)有关,让人感到很神奇的事情是在用T命令执行mov ss,ax的时候,它的下一条指令mov sp,10也紧接着执行了,在这之中一定存在着我目前未知的“秘密”。在这里只能初步的下结论为 Debug的T命令在执行修改寄存器SS的指令时,下一条指令也紧接着被执行。这其中的原因与中断机制有关。(在这里我在网上搜索了一些有关中断机制的信息:https://blog.csdn.net/fivedoumi/article/details/50451228?utm_source=blogxgwz7)

    接着,就是实验的正文部分了。

    实验任务(1):使用Debug,将下面的程序段写入内存,逐条执行,根据指令执行后的实际情况填空。

    (——首先用e命令修改内存单元内容)

    (——接着用a命令写入汇编指令,并开始调试)

    (——用t命令调试push ax指令,查看栈段中相应部分是否发生变化)

    (——用t命令调试push bx指令,查看栈段中相应部分是否发生变化)

    (——观察t命令在执行pop ax,pop bx时,ax与bx寄存器是否发生变化)

    (——把内存单元在储存的内容压入栈中,观察栈中内容是否发生变化)

    (上图是理论分析得出来的结果)

    实验发现实际与理论上的结果一样,但是在执行指令mov ss,ax后,紧接着就执行了mov sp,0100的指令,在黑框中没有显示出来,这与预备知识中第二块内容相吻合。

    实验任务(2):根据图中所给出的实验过程,分析为什么2000:0~2000:f中的内容会发生改变?

    (——a命令写入汇编指令,并查看相应内存单元的内容)

    (——开始单步调试,每次都查看相应的内存单元的内容)

    mov ax,2000——将2000H放入ax寄存器中,此时ax=2000H

    mov ss,ax——将ax寄存器中的内容移入ss寄存器中,此时ss=2000H

    mov sp,10——将10H移入sp寄存器中,此时sp=10H,意味着该空栈此时栈顶的位置在2000:0010的地方,而栈底为2000:000e的地址处。

    通过单步调试可以发现,内存地址从2000:0开始到2000:f结束的这段栈空间内,发生着一些很奇妙的变化。在还没开始将ax的值压入这段栈空间时,它内存单元的内容发生了改变。之后执行完push ax,栈内存单元内容发生改变是正常的,而在此之前会什么会发生变化呢?通过查看课后习题的答案,得到了这样的解释:因为Debug中使用T等指令引发了中断造成的,中断过程中使用当前栈空间存放CPU关键数据,所以此时该栈里有些不是我们自己的操作数据了。在解释中还提及到了如果在中断过程中压栈使栈越界的话,在windows下的命令窗口会强制关闭。想来或许这正是计算机的高深与神秘之处了。

  • 相关阅读:
    用户和用户组管理
    浏览器从输入URL到页面加载显示完成全过程解析
    easyui form提交和formdata提交记录,查看FormData对象内部的值
    Hybrid App中原生页面 VS H5页面(分享)
    ui-router .state参数配置
    利用webpack手动构建vue工程
    使用json对象要注意的地方
    js中使用0 “” null undefined {}需要注意
    已知宽高和未知宽高的div块的水平垂直居中
    jquery easyui datagrid 空白条处理 自适应宽高 格式化函数formmater 初始化时会报错 cannot read property 'width'||'length' of null|undefined
  • 原文地址:https://www.cnblogs.com/zjybel/p/9866611.html
Copyright © 2020-2023  润新知