• 《汇编语言》实验二——用机器指令和汇编指令编程


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

    前提说明:为便于验证实验结果,对实验任务一做了2点调整:

    ①在使用a命令输入指令调试前,使用e命令将内存单元0021:0~0021:7连续8个字节数据修改为30H,31H,32H,33H,34H,35H,36H,37H。如下:

    ②将程序段的第一行 mov ax,ffff修改为 mov ax,0021。如下:

    接下来,逐条执行语句,观察各寄存器的变化。

    根据实验结果,得到:

    实验结果与预期基本一致,不过发现了一个奇怪的现象,在单步调试的过程中,mov ss,ax的下一步本应是mov sp,0100,但在实际操作时发现,下一步变成了mov ax,[0],而mov sp,0100被自动执行了。通过查阅资料得知,这与CPU的中断机制有关,目前只需要知道debug的T命令在执行修改寄存器SS的指令时,下一条指令也紧接着被执行。

    实验任务二:输入如下七行代码,分析2000:0~2000:f中的内容为什么会改变。

    用a命令输入上述代码,并用e命令修改和查看2000:0~2000:f的内容:

    单步调试,并且每步调试后都用d命令查看2000:0~2000:f的值:

     从中可以发现,前3行的作用是把2000:0~2000:f这段空间当作栈段,初始栈底为2000:f,初始栈顶为2000:10。一个奇怪的现象是,在2000:0~2000:f被初始化为0后,后面除了入栈操作对这段空间有修改外,其他的一些操作也对这段空间的内容作了修改,为什么会这样呢?注意观察发现,那些除入栈操作对空间的修改并不是随意的,而是把某些寄存器如cs,ip,ax的值存入了栈空间。这其中的原因与内中断有关,t命令实际是引发了单步中断,执行中断例程时,CPU会将一些中断例程使用的的寄存器变量自动压栈到栈中,此例中就包括了上述的寄存器变量的值。

  • 相关阅读:
    Windows 2008 server + IIS 7 设置身份模拟(ASP.NET impersonation)
    记录windows操作系统启动日志
    C# 重启计算机的问题
    AcWing 1086 恨7不是妻
    AcWing 1084. 数字游戏 II
    AcWing 1083. Windy数
    golang学习笔记 生成JSON及解析JSON 清明
    WEB前端底层知识之浏览器是如何工作的(2)渲染引擎
    ASP.NET MVC Razor 输出没有编码的HTML字符串
    ext.grid的配置属性和方法
  • 原文地址:https://www.cnblogs.com/kevin234/p/9887440.html
Copyright © 2020-2023  润新知