【实验一】8086汇编指令编码和调试

@

1、实验任务一

  • 练习教材实验1「1 预备知识:Debug的使用」
  • 练习教材实验2 「1 预备知识:Debug的使用」
  • 练习教材4.6节使用masm、link得到8086汇编可执行程序及运行程序方法
    注*: 已经练习并熟练掌握debug、masm、link用法的同学,可跳过。
    在这里插入图片描述
    (跳过任务一)

2、实验任务二

PC机主板上的ROM中有一个生产时期,在内存FFF00H ~ FFFFFH的某几个单元中,找到这个生产时期,并试图修改它。

在debug中,使用d命令查看生产日期

在这里插入图片描述

使用e命令修改生产时期所在的内存单元,修改后,再次使用d命令查看

在这里插入图片描述
发现修改数据后没有任何变化。

分析原因

在这里插入图片描述
C0000~FFFFF 的地址空间中都是ROM(Read Only Media)。字面意思上就可以看出ROM是不可以修改的。此次任务的结果(修改PC机主板上的ROM中的生产时期失败)也证实了这一点。

3、实验任务三

在debug中,使用e命令,向内存单元填写数据。
-e b800:0 03 04 03 04 03 04 03 04 03 04
从b800:0开始的内存单元开始,依次写入十六进制数据04 03,重复写5次。

在这里插入图片描述

在debug中,使用f命令,向内存单元批量填写数据。
-f b800:0f00 0f9f 03 04
把内存单元区间b800:0f00 ~ b800:0f9f连续160个字节,依次重复填充十六进制数据03 04

在这里插入图片描述

4、实验任务四

在这里插入图片描述

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:题目要求是把00220H ~ 0022fH用作栈空间。指令 mov ss, ax 和 mov sp, 30 执行后,栈顶的逻辑地址和物理地址分别是?

逻辑地址:20:30
物理地址:00230H

问题2:单步调试到汇编指令 push [6] 执行结束, pop [6] 执行之前,使用 d 20:20 2f 查看此时栈空间数据,给出实验截图。

在这里插入图片描述

问题3:汇编指令 pop [0] 执行结束后, pop [0] 指令执行结束后,使用d命令 d 20:0 7 查看此时数据空间内的数据是否有变化。给出实验截图.

在这里插入图片描述

问题4:如果把最后四条指令改成截图中的顺序, pop [6] 指令执行结束后,使用d命令 d 20:0 7查看此时数据空间内的数据是否有变化。给出实验截图。

在这里插入图片描述
在这里插入图片描述

5、实验任务五

在debug环境中,实践以下内容。
在这里插入图片描述

先使用f命令,把00220H ~ 0022fH区间的16个字节内存单元值全部修改为0。并使用d命令查看确认。
然后,使用a命令、r命令、t命令写入汇编指令并单步调试。
观察并思考:

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

似乎执行mov ss, ax 后就跟着执行了mov sp, 30 。

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

测试发现,从操作栈段寄存器(ss)开始(mov ss, ax)。栈空间存放着当前指指令段地址(cs)和偏移地址(ip)。
另一个同学对此问题的解答1
另一个同学对此问题的解答2
在这里插入图片描述

assume cs:code

code segment
start:	
        ;============================
        ;把00220H ~ 0022fH区间的16个字节内存单元值全部修改为0
        mov ax, 20h
	    mov ds,ax
        mov bx, 20h
        mov cx, 16

s:      mov byte ptr [bx], 0
        inc bx
	    loop s
        ;============================
	
        mov ax, 20h
        mov ss, ax
        mov sp, 30h
        mov ax, 2010h
        push ax
        mov ax, 4030h
        push ax

	mov ah, 4ch
	int 21h
code ends
end start

6、实验任务六

使用任何一款文本编辑器,编写8086汇编程序源码。

assume cs : code
code segment
start:
		mov Cx,10
		mov d1,'0'
s: 		mov ah, 2
		int 21h
		add d1, 1
		1oop s
		mov ah, 4ch
		int 21h
code ends
end start

使用masm、link,汇编、链接,得到可执行文件task5.exe。运行程序。结合程序运行结果,理解程序功能。

在这里插入图片描述

使用debug工具,调试task5.exe。根据第4章所学知识,任何可执行程序在执行时,都有一个引导程序负责将其加载到内存,并将CPU控制权移交给它,也即将CS:IP指向可执行程序中第一条机器指令。在加载可执行程序时,可执行前面512字节是程序段前PSP(Program Segment Prefix),用于记录程序一些相关信息。
在debug中,使用d命令,查看task5.exe的程序段前缀,观察这256个字节的内容,验证前两个字节是否是CD 20

在这里插入图片描述

7、实验任务七

下面程序的功能是,完成自身代码的自我复制:把 mov ax, 4c00h 之前的指令复制到内存0:200开始的
连续的内存单元。
补全程序,并在debug中调试验证,确认是否正确实现了复制要求。

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

(1) 补全程序。说明这样填写的依据。
第一空:将程序的代码段地址赋值给数据段地址,于是cs-->ax;
第二空:先在空上任意填写一个数值再编译链接debug,mov ax, 4c00h 所在偏移地址即为所求。

(2) 在debug中调试,使用g命令将程序执行到 loop s 之后、 mov ax, 4c00h 之前,然后,使用u命令对0:200h开始的内存单元反汇编,确认是否把task7.asm中line3-line12的代码复制到了目标内存空间。
在这里插入图片描述

实验总结

CPU 实模式 保护模式 和虚拟8086模式
80x86 CPU 的工作模式
通过这几个任务,更加理解掌握了基础知识,工具使用。体会了实模式下操作内存空间的快感。

posted @ 2021-10-20 19:58  庚瘤君  阅读(108)  评论(4编辑  收藏  举报