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

一、实验目的

1. 熟练掌握使用debug工具编写和调试x86汇编命令的方法
2. 掌握8086CPU、寄存器、内存的基础知识
3. 理解并掌握内存中多字节数据的存放:小端法
4. 理解并掌握「栈」内存空间的特性和使用
5. 掌握指令mov, add, sub, jmp, push, pop的基础用法

二、实验准备

1. 复习教材第1~2章内容,完成教材内相关检测点
2. 复习教材第3章「栈」的知识:栈的特性、寄存器 SS 和 SP、指令 push 和 pop ,完成教材
  3.6~3.9 节内的问题 3.6~3.12,检测点 3.1~3.2
3. 结合教材实验1(P35)和课程QQ群文件中的文档,学习debug工具用法。
  在课程QQ群文件->工具软件及相关文档说明文件夹,有如下文档:
  关于汇编实验软件的简要说明.pdf
  debug工具简介及用法.pdf

三、实验内容

1. 教材实验1(P35)
  练习教材P35-45「预备知识:Debug的使用」,学习debug启动、退出及常用指令用法;
  在练习基础上,完成「2. 实验任务」
  提示&说明*:
  这里共有4个小的实验任务。每一项任务在教材前序内容或者练习中都有提示线索。所以,建议你
  先认真完成「二、实验准备」中要求的内容及debug工具练习,再着手做「2. 实验任务」,会更
  高效。比如:
  实验任务(1):可参照教材P41-43的(7) E命令和U命令完成;
  实验任务(2):与教材P20的检测点(2)相似且相关;
2. 教材实验2(P71)
  练习「1.预备知识:Debug 的使用」
  在练习基础上,完成「2. 实验任务」
   为了便于验证实验结果,对「2. 实验任务」的(1)做如下两点调整:
  ① 在使用 a 命令输入指令调试之前,先使用 e 命令将内存单元 0022:0 ~0022:7连续 8 个字
  节数据修改为 50H, 51H, 52H, 53H, 54H, 55H, 56H, 57H
  ② 将 P74 实验任务(1)中第1行的 mov ax, ffff → 改为 mov ax, 0022
  实验前,请先从理论上分析指令执行后各个填空处的值,并记录下来。
  实验时,通过在debug中调试,观察实验结果与理论分析是否一致;如果存在不一致的情形,尝试
  发现问题所在,并分析原因。

四、实验结论

(1)教材实验1(P35)

1.实验任务(1)

使用debug,将下面的程序段写入内存,逐条执行,观察每条指令执行后CPU中相关寄存器内容的变化。

-a 不带地址, 默认当前cs ip地址开始写指令,若指定逻辑地址则从逻辑地址开始写汇编指令

-t单步执行,默认从当前cs ip 开始执行,若指定-t执行地址则指定地址开始单步跟踪或者修改cs ip从cs:ip的地址开始单步调试

a命令以汇编指令的形式向内存写入数据并且t命令单步跟踪:

e命令以机器码的形式向内存写入数据并且t命令单步跟踪:

 

u查看反汇编指令:

2.实验任务(2)

3条指令写入2000:0开始的内存单元以计算2的8次方

 先更改CS和IP的值为2000:0  然后向此位置开始写汇编指令:

单步执行两次后ax中的值为2再执行后跳转到ax的自加指令:

ax此时为2再连续执行自加7次后为2的8次方ax=2^8=0100H:(即14次单步调试每自加一次后再次跳转到自加指令)

3.实验任务(3)

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

无法修改的原因:8086PC机中,FFF00H~FFFFFH为ROM空间,向其写入数据是无效的,这等于改写只读存储器中的值。

4.实验任务(4)

 

 

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

(2)教材实验2(P71)

1.实验任务(1)

使用 e 命令修改 2000:0~2000:f 的值,修改后查看相应部分

a 命令输入的指令然后单步执行:

mov ax,ffff 
mov ds,ax 
mov ax,2200 
mov ss,ax 
mov sp,0100 
mov ax,[0];
add ax,[2];
mov bx,[4];
add bx,[6]; 
push ax;
push bx;
pop ax;
pop bx;
push [4];
push [6];

填空内容如下:

mov ax,ffff 
mov ds,ax 
mov ax,2200 mov ss,ax
mov sp,0100
mov ax,[0]     ;ax=C0EA add ax,[2]     ;ax=C0FC mov bx,[4]     ;bx=30F0 add bx,[6]     ;bx=6021 push ax       ;sp= 00FE ;修改的内存单元的地址是2200:00FE 内容为C0FC push bx       ;sp= 00FC ;修改的内存单元的地址是2200:00FC 内容为6021 pop ax       ;sp= 00FE ;ax=6021 pop bx       ;sp=0100 ;bx=C0FC push [4]      ;sp= 00FE ;修改的内存单元的地址是2200:00FE 内容为30F0 push [6]      ;sp= 00FC ;修改的内存单元的地址是2200:00FC 内容为2F31

2.实验任务(2)

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

单步调试每一行汇编指令的截图。每一条指令单步调试后,都使用 d 命令查看
2000:0~2000:f 的值。观察每一条指令执行后相关寄存器值的变化,及 2000:0~2000:f 单元
值的变化,并思考原因。

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

 mov ax,2000:将数据2000写入寄存器ax中

mov ss,ax:通过ax设置栈的段地址
 mov sp,10:设置栈指针寄存器,SP=0010H

指令mov sp,10表示初始化栈指针寄存器。SS:SP(2000:0010)记录栈顶元素。

初始时栈顶为2000:0010;栈底为2000:000F;

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

出现栈中数据变化与中断机制有关。

五、实验总结

-a 不带地址 默认当前cs ip地址开始写指令

-a 0:200 指定逻辑地址,则是从指定了的逻辑地址开始写汇编指令

-t单步执行trace单步跟踪 默认从当前cs ip 开始执行 要么指定t执行地址 t=0:200指定地址开始单步跟踪 要么修改cs ip

 

   

posted @ 2020-10-14 19:26  yu136  阅读(237)  评论(1)    收藏  举报