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

原文地址:https://www.cnblogs.com/zuiyankh/p/13811396.html