• 实验1 用机器指令和汇编指令编程


    一、教材实验1(P35)

    1、用e命令和a命令两种方式将指令写入内存,用t命令单步调试。

    e命令修改,d命令查看,u命令反汇编

    a命令书写

    t命令逐步调试,可得出结果:ax=8236, bx=2000;  cs:ip=073f:010b

    2、利用3条指令计算2的8次方

    逐步执行后,得出最终结果:ax=2^8=0100H

    3、找到PC主板上ROM中的生产日期,在内存FFF00H~FFFFFH的某几个单元中,并试图改变它。

       利用d命令,从FFF00H开始查看内存信息,可以发现生产日期在FFF0:00F0~00FF中,并无法改变该部分内容。查看1.15节可知,C0000~FFFFF为各类ROM地址空间,该部分内容只可读取,不可改变。

    4、向内存从B8100H开始的单元中填写数据

    在该内存填写数据不同,显示的图形和颜色不同;修改的地址不同,显示的位置不同。

    由1.15节知识可知,A0000~BFFFF为显存地址空间,向该部分中写入的数据,会被显示卡输出到显示器上。 

    二、教材实验2(P71

    1.1 使用 e 命令修改内存单元0022:0~0022:f 中的数据,及修改后查看是否正确 写入的操作

    1.2 使用 a 命令输入的 p74 指令

    1.3 每一行指令单步调试(如单步调试步骤多,可分屏截图,但不要有遗漏)

    1.4 P74 中指令执行后各个寄存器填空结果

    mov ax,[0]

    add  ax,[2]

    mov bx,[4]

    add  bx,[6]

    ax=C0EA

    ax=C0FC

    bx=30F0

    bx=6021

    push ax

    push bx

    pop ax

    pop bx

    sp=00FE;修改的内存单元地址:00FF,00FE; 内容为C0FC

    sp=00FC;修改的内存单元地址:00FD,00FC;内容为6021

    sp=00FE;ax=6021     //栈先进后出

    sp=0100;bx=C0FC    //此时栈空

    push [4]

    push [6]

    sp=00FE;修改的内存单元地址:00FF,00FE; 内容为30F0

    sp=00FC;修改的内存单元地址:00FD,00FC;内容为2F31

    2.1 使用 a命令输入的 7 行指令,使用 e 命令修改 2000:0~2000:f 的值, 及修改后查看的部分

    2.2 单步调试每一行汇编指令。每一条指令单步调试后,都使用 d 命令查看 2000:0~2000:f 的值。

    2.3 前3行汇编指令的功能,特别是,mov sp, 10意味着什么?初始时栈顶和栈底分别是?

    前3行设置栈顶位置,将SS:SP指向我们定义的栈段2000:0010,因为不能直接向段寄存器SS中送入数据,所以用ax中转。mov sp,10表示初始化栈顶为0010。

    栈顶=2000:0010;栈底=2000:000E

    2.4 基于单步调试观察到的变化,给出你对此的思考及可能原因分析

    设置栈顶位置后,2000:0~f存储了cs,ip,ax等的内容。

    通过搜索得知,与中断机制有关。mov ss,ax执行后,mov sp,10立即执行,然后靠近栈顶的10个字节发生变化,对部分环境变量,如ss,ip,cs进行暂存,以保护现场。

  • 相关阅读:
    Ajax基础:3.Json
    Head First Design Patterns State Pattern
    Head First Design Patterns Template Method Pattern
    Articles For CSS Related
    Head First Design Patterns Decorator Pattern
    代码审查工具
    How To Be More Active In A Group
    Head First Design Patterns Factory Method Pattern
    Head First Design Patterns Composite Pattern
    Tech Articles
  • 原文地址:https://www.cnblogs.com/zuiyankh/p/13811396.html
Copyright © 2020-2023  润新知