Live2d Test Env

汇编语言实验一

汇编语言程序设计实验一

实验目的

  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工具用法。

实验内容

教材实验1

(1).把如下的程序段写入内存,逐条执行,观察每条指令执行后CPU中相关寄存器中内容的变化。

机器码 汇编指令
b8 20 4e mov ax,4E20H
05 16 14 add ax,1416H
bb 00 20 mov bx,200H
01 d8 add ax,bx

使用a命令将指令写入内存;

使用t执行命令,注意观察CS:IP的指向变化:

1

使用e命令以机器码的形式将指令写入内存中:

使用t执行命令,注意观察CS:IP的指向变化:

2

使用u进行反汇编,与输入的机器码进行对比:

反汇编

(2).使用一下 3 条指令写入从 2000:0 开始的内存单元中,利用这 3 条指令计算 2 的 8 次方

mov ax,1

add ax,ax

jmp 2000:0003

使用a指令将汇编指令写入内存,调整cs和ip寄存器的内容:
alt

t指令单步调试得到结果:ax=0100,即为$2^8$

7

分析:

指令的第一步是将ax赋初值为1,第二步是ax+=ax,即ax变为原先的二倍,最后执行第三步的跳转指令再次将ax变为原先的2倍,所以执行一轮就相当于乘以2,所以单步调试16次就得到结果AX=0100;

(3).PC机主板上的ROM中写着一个生产日期,在内存 FFF00H~FFFFFH 的某几个单元中,找到这个生产日期并试图改变它;

首先使用d命令进行查看:

从下图可以看出日期存在于FFFF5H-FFFFFH之间:

原先

对该区域使用-e命令进行更改发现无效

修改查看

原因:ROM是只读存储器,不可能修改内存中的值;

(4).向内存从B8100H开始的单元中填写数据,如:

-e B8100:0000 01 01 02 02 03 03 04 04

通过写入不同的数据,返现屏幕中会出现不同数量的表情符号;

填写不同数据1

填写不同数据2

这是因为8000H-9FFFH是显存地址空间,在其中写入不同的数据也会相应的显示出不同的图案结果;

教材实验二

(1).使用Debug,将下面的程序段写入内存,逐条执行,根据指令执行后的实际运行情况填空。

mov ax,0022

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]

在使用a命令输入指令调试之前,先使用e命令将内存单元0022:0-0022:7连续8个字节数据修改为50H,51H,52H,53H,54H,55H,56H,57H

使用e命令修改数据:

8

将程序段写入内存:

9

逐条执行,分析结果:
t1

t2

t3

实验结果与预期结果相同,下面是具体的结果和分析:

汇编指令 结果数据 分析
mov ax,0022 0022 ax赋值为0022
mov ds,ax 0022 内存单元段地址设置为ax
mov ax,2200 2200 ax赋值为2200
mov ss,ax 2200 栈顶指针赋值为2200
mov sp,0100 0100 栈顶的偏移地址为0100
mov ax,[0] ax=5150 2200:0处的两个字节
add ax,[2] ax=5352+5150=A4A2 ax+5352
mov bx,[4] bx=5554 2200:4处的两个字节
add bx,[6] bx=5554+5756=ACAA bx+5756
push ax sp=0100-2=00FE 存入A4A2 栈顶上移2字节
push bx sp=00FE-2=00FC 存入ACAA 栈顶上移2字节
pop ax sp=00FE;ax=ACAA 栈顶下移2字节
pop bx sp=0100;bx=A4A2 栈顶下移2字节
push[6] sp=00FC;存入5756 栈顶上移2字节

(2).观察3.19中的实验过程,然后分析:为什么2000:0-2000:f中的内容会发生改变;

输入指令单步调试

h1

p1

通过实验发现mov ss,ax和mov sp,10一同被执行,

(学完中断之后补的)此外我们可以看到当使用t命令执行到mov ss,ax的时候栈中就存在了本不应该存在的数据:01A3,073F,0108,2000,其中01A3不知道是什么但是后面三个分别是cs,ip,ss,因为t是单步中断指令,因此我们推测,就像是多个循环使用栈来保存和恢复cx一样,这里cpu会自动保护现场,将cs,ip,ss存入栈中,以便恢复现场。

实验总结

  • 本次实验是我熟悉了debug的各项命令以及应用场景,可以初步使用debug工具来对问题进行分析与实验;
  • 通过本次实验将计算机组成原理的相关知识迁移过来,例如:ROM是只读存储器,不能进行修改;更好的理解了大端、小端存储的相关概念,以及基地址、偏移量的具体使用;
  • 对于栈这一数据结构在汇编使用的场景与形式有了更为直观的理解,了解到了书写程序时爆栈等异常的出现原因
posted @ 2020-10-10 00:59  lszz  阅读(390)  评论(3)    收藏  举报