实验1 8086汇编指令编码和调试

一、实验目的

  1. 掌握8086CPU、寄存器、内存(包括栈空间)的基础知识

  2. 掌握汇编源程序组成与结构

  3. 理解和掌握寄存器间接寻址方式[bx]

  4. 掌握汇编指令mov, add, sub, jmp, push, pop,loop的用法,理解高级语言的表达和抽象机制

  5. 熟练掌握使用debug工具编写和调试x86汇编命令的方法

  6. 掌握汇编语言源程序编写→汇编→链接→调试的工具和方法

二、实验准备

  1. 复习教材1-5章

  2. 准备好软件实验环境

    软件,及其安装说明文档,请从课程q群->实验文件夹下载。

  3. 熟悉工具用法

    • debug工具用法,参照:

      • 教材实验1「1 预备知识:Debug的使用」
      • 教材实验2 「1 预备知识:Debug的使用」
    • 文档「debug工具简介及用法.pdf」。可从课程q群->实验文件夹下载。

    • masm、link及运行可执行程序的方法,参照教材第4章。

四、实验结论

1. 实验任务1

自行练习,掌握工具用法。此部分无需写实验结论。

如练习中遇到、发现问题,使用搜索引擎,以及,和同学讨论后,都暂时未能得到解决或释疑,可以写

入这一部分。共大家一起讨论。

实验一:

​ 1. 使用a指令将指令写入内存中,用u查看看结果如下:

  1. 使用t命令执行如下:

  1. 求2的8次方

  1. 在内存b810:0中写入 01 01 02 02 03 03 04 04,实验结果如下:

实验2:

  1. 输入程序:

  1. 执行结果

    见书

2. 实验任务2

  1. 通过d命令查看ROM生产日期:,在最后的数据段,显示生成日期为1992/01/01

  1. 通过e命令修改生成日期,失败

3. 实验任务3

  • 给出在debug中使用e命令修改内存单元的命令,及,效果截图

  • 给出在debug中使用f命令批量填充内存单元的命令,及,效果截图

  • 尝试修改内存单元,或,数据后的效果截图

  1. 使用e命令修改内存

  1. 使用f命令批量填充内存单元

4. 实验任务4

根据在debug环境中调试观察结果,填空并回答问题。

-a
mov ax, 20 
mov ds, ax 
mov ss, ax 
mov sp, 30 
push [0] ; 执行后,寄存器(sp) = _2E_ 
push [2] ; 执行后,寄存器(sp) = _2C_ 
push [4] ; 执行后,寄存器(sp) = _2A_ 
push [6] ; 执行后,寄存器(sp) = _28_ 
pop [6] ; 执行后,寄存器(sp) = _2A_ 
pop [4] ; 执行后,寄存器(sp) = _2C_ 
pop [2] ; 执行后,寄存器(sp) = _2E_ 
pop [0] ; 执行后,寄存器(sp) = _30_

问题1

栈顶的物理地址是:0022fH,逻辑地址:0;

问题2

问题3:

数据没有变化。

问题4:

数据有变换,数据的顺序颠倒了。

5. 实验任务5

回答问题1和问题2。

问题1:使用t命令单步执行 mov ss, ax 时,是单步执行完这一条指令就暂停了吗?后面的指令 mov sp, 30 是什么时候执行的?

问题2:根据汇编指令,前三条指令执行后,00220H ~ 0022fH被设置为栈空间。并且,初始时,已通过f命令将初始栈空间全部填充为0。观察单步调试时,栈空间00220H ~ 0022fH内存单元值的变化,特别是图示中黄色下划线表示出的数据值。根据实验观察,尝试思考和分析原因。

问题1:

是的,使用t命令只会执行一条命令。再次使用t命令,mov sp 30将会执行。

问题2:

第二处划划线的内容刚好存储的是cs,ip的地址

6.实验任务6

1.代码的源程序

assume cs:code

code segment
start: 
	mov cx,10
	mov dl,'0'
s:  mov ah,2
	int 21h
	add dl,1
	loop s
	
	mov ah,4ch
	int 21h
code ends
end start

2.masm,link,执行的截图

3.debug查看PSP内容

PSP的内容指的是程序段前面的256字节的保护空间,如下图所示,就是数据段寄存器ds中的地址和程序段地址之间的差距。

前两个字节的内容是CD 20.


需要复习PSP相关的知识点


7.实验任务7

  1. 代码

因为需要实现程序复制,根据上下文可以判断出ds指向的是复制前程序的地址,所以ds的值就是程序段的段地址cs,

cx在循环中是循环次数,因为程序是每次复制一个字节,所以循环的次数就是程序的长度cx

assume cs:code
code segment
	mov ax,cs
	mov ds,ax
	mov ax,20h
	mov es,ax
	mov bx,0
	mov cx,cx
s:	mov al,[bx]
	mov es:[bx],al
	inc bx
	loop s
	
	mov ax,4c00h
	int 21h
code ends
end

原文地址:https://www.cnblogs.com/hjw201983290498/p/15435289.html