• 实验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进行暂存,以保护现场。

  • 相关阅读:
    Create procedure
    json
    XSLT
    使用 ActiveMQ 示例
    使用Apache FtpServer搭建FTP服务器
    Publisher/Subscriber(发布/订阅者)消息模式开发流程
    使用 ActiveMQ 示例
    内嵌jetty
    基于Atom协议的数据接入规范
    C++创建jni 并且利用rundll32.exe调试jni程序
  • 原文地址:https://www.cnblogs.com/zuiyankh/p/13811396.html
Copyright © 2020-2023  润新知