实验结论

1.实验任务1

2.实验任务2

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

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

实验1 用汇编指令编码和调试_汇编指令

生产日期:1992年1月1日

  • 使用e命令修改生产时期所在的内存单元,修改后,再次使用d命令查看实验1 用汇编指令编码和调试_反汇编_02

结论:ROM是只读寄存器,不能修改

3.实验任务3

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

       实验1 用汇编指令编码和调试_反汇编_03

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

       实验1 用汇编指令编码和调试_寄存器_04

  • 尝试修改内存的数据,并在此观察结果。

       实验1 用汇编指令编码和调试_寄存器_05

 4.实验任务4

在debug环境中,按顺序录入以下内容,单步跟踪调试,观察寄存器和内存空间00200H~00207H,以 及,栈空间00220 ~ 0022fH内容变化情况。记录实验结果。回答问题,验证和你的理论分析结果是否一 致。

  • 填空
 1 -a
 2 mov ax, 20
 3 mov ds, ax
 4 mov ss, ax
 5 mov sp, 30
 6 push [0]        ;执行后,寄存器(sp)=002E
 7 push [2]        ;执行后,寄存器(sp)=002C
 8 push [4]        ;执行后,寄存器(sp)=002A
 9 push [6]        ;执行后,寄存器(sp)=0028
10 pop [6]         ;执行后,寄存器(sp)=002A
11 pop [4]         ;执行后,寄存器(sp)=002C
12 pop [2]         ;执行后,寄存器(sp)=002E
13 pop [0]         ;执行后,寄存器(sp)=0030
  • 回答问题

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

栈顶的物理地址是00230H,逻辑地址为0020H:0030H。

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

实验1 用汇编指令编码和调试_数据_06

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

实验1 用汇编指令编码和调试_反汇编_07

由上图可知,此时数据空间内的数据没有变化。

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

新指令:

实验1 用汇编指令编码和调试_反汇编_08

 指令执行情况:

实验1 用汇编指令编码和调试_汇编指令_09

由图可知,此时数据空间内的数据发生了变化,数据顺序发生了改变。

5.实验任务5

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

答:没有暂停,后面的指令mov sp, 30是与mov ss, ax一起执行的。

 

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

答:由于在debug中使用t命令单步调试导致中断,cpu在该空间存放关键数据,导致修改了栈内的数据。图中黄色下划线表示的数据是下一步指令所在的内存地址。

6.实验任务6

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

t6.asm

   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,汇编、链接,得到可执行文件task5.exe。运行程序。结合程序运行结果,理解程序功能。

  • masm

实验1 用汇编指令编码和调试_数据_10

  •  link

实验1 用汇编指令编码和调试_汇编指令_11

  •  运行可执行文件t6.exe,运行结果如下图:0123456789

实验1 用汇编指令编码和调试_汇编指令_12

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

在debug中,使用d命令,查看t6.exe的程序段前缀,观察这256个字节的内容,验证前两个字节是否是CD 20。

实验1 用汇编指令编码和调试_数据空间_13

 7.实验任务7

1.给出补全后的完整程序,说明程序程序中两个空填写的依据。

t7.asm

 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, 17h
 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

第一空:cs为代码段的起始地址,将其赋给ds作为复制的原地址。

第二空:总的代码段为001CH字节,而mov ax, 4c00h和int 21h命令占5H字节 ,所以line3-line12 代码段为0017H字节。

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

给出使用g命令运行到指定点和使用u命令反汇编0:200到复制代码长度这一段内存空间的截图。

  • g命令

实验1 用汇编指令编码和调试_数据_14

  • 反汇编

 实验1 用汇编指令编码和调试_汇编指令_15