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

实验任务二

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

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

 

结论:发现尝试修改ROM的生产日期时操作是无效的,原因是ROM芯片是只读不可写的,固然无法更改其中的生产日期。

实验任务三

在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。

 实验任务四

(1) 单步执行,在执行push指令和pop指令时,观察并记录栈顶偏移地址的寄存器sp值的变化情况。

-a
mov ax, 20 
mov ds, ax 
mov ss, ax 
mov sp, 30 
push [0] ; 执行后,寄存器(sp) = 002E 
push [2] ; 执行后,寄存器(sp) = 002C 
push [4] ; 执行后,寄存器(sp) = 002A 
push [6] ; 执行后,寄存器(sp) = 0028 
pop [6] ; 执行后,寄存器(sp) = 002A
pop [4] ; 执行后,寄存器(sp) = 002C 
pop [2] ; 执行后,寄存器(sp) = 002E 
pop [0] ; 执行后,寄存器(sp) = 0030

  

(2) push [6] 指令执行结束后, pop [6] 指令执行结束前,使用d命令 d 20:20 2f 查看此时栈空间的数据。

(3) pop [0] 指令执行结束后,使用d命令 d 20:0 7 查看此时数据空间内的数据是否有变化。

 

汇编指令执行完之后,内存空间的数据没有发生变化。

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

在改变顺序之后,顺序发生了改变,因为出栈的顺序发生了改变。

  实验任务五

(1)没有暂停,mov ss,ax和mov sp,30 继续执行。

这里涉及到了中断,原本在第二次t命令之后,cs:ip指向的命令是mov ax,2010,而不是原本的mov sp,30。ss的内容送入之后,sp的内容也立刻被送入。

(2)08 01 为偏移地址。3F 07 为程序段地址,作为暂存地址,在该程序中存在中断机制,需要暂存原程序的入口,故存了下来。

 实验任务六

task6经过masm、link、运行结果如下

 最终结果输出了0123456789

查看PSP内容

 程序的前两个字节是CD 和20

实验任务七

(1)代码补全后为

 1 assume cs:code
 2 code segment
 3     mov ax, cs
 4     mov ds, ax
 5     mov ax, 0020h
 6     mov es, ax
 7     mov bx, 0
 8     mov cx, 23
 9 s: mov al, [bx]
10     mov es:[bx], al
11     inc bx
12     loop s
13 
14     mov ax, 4c00h
15     int 21h
16 code ends
17 end

程序将要完成的功能是复制部分自身代码至内存0:200开始的连续内存单元。此代码实现的功能是将内存单元ds:[bx]处开始的数据复制至内存单元es:[bx]处。因此第一空填cs,将程序段首地址信息送入段寄存器ds中;第二空的数字即复制字节的循环次数,使用debug调试程序知被复制代码的长度为23字节,因此填23。

(2)用g命令运行部分代码和使用u命令反汇编0:200处内存空间数据:

 确定代码复制到了目标空间

posted @ 2021-10-25 19:19  流年h  阅读(61)  评论(2)    收藏  举报