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

实验任务2

 

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

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

结论:内存中的内容不可以修改。因为这段内存是ROM内存单元,是只读的,不可以修改。

 

实验任务3

(1)在debug中使用e命令修改内存单元

(2)在debug中使用f命令批量填充内存单元

(3)修改内存数据后的结果

 

实验任务4

 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 执行后,

栈顶的逻辑地址和物理地址分别是?

    答:逻辑地址:0020:0030

           物理地址: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

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

sp, 30 是什么时候执行的?

  答案:不是单步执行完mov ss,ax就暂停,t命令在执行修改ss的指令时,下一条指令也紧接着被执行,因此mov sp,30是在t命令执行完mov ss,ax后执行的。

问题2:根据汇编指令,前三条指令执行后,00220H ~ 0022fH被设置为栈空间。并且,初始时,已通

过f命令将初始栈空间全部填充为0。观察单步调试时,栈空间00220H ~ 0022fH内存单元值的变化,特

别是图示中黄色下划线表示出的数据值。根据实验观察,尝试思考和分析原因。

  答案:t命令是单步执行命令,而栈空间的内存单元值变化与单步执行有关,在单步执行后中断,将CS IP的值存入栈内。

 

实验任务6

程序源码:

 1 assume cs:code
 2 
 3 code segment
 4     start:
 5     mov cx, 10
 6     mov dl, '0'
 7      s: mov ah, 2
 8     int 21h
 9     add dl, 1
10     loop s
11 
12     mov ah, 4ch
13     int 21h
14 code ends
15 end start
(2)给出使用masm、link对程序汇编链接过程截图,以及,运行可执行程序task5.exe的运行结果
    运行结果:
(3)给出在debug中查看task5.exe的程序段前缀PSP的截图。
 
实验任务7
(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, 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

    填写依据:1.程序代码段地址是cs,要将寄存器cs中的内容赋值给ax,然后再存入段地址ds。

                      2.先赋值给cx进行debug,r命令得到cx是21h,但要把 mov ax, 4c00h 之前的指令复制到内存0:200开始的连续的内存单元,因此cx是21h-5h=17h。

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

 

 

五、实验总结

(1)通过本次实验,我发现仅仅从书上获取知识远远不足以支撑我写本次实验,需要每次的亲自实践和查阅相关资料,了解更多的内容才能做好。

(2)在实验中,更深刻的理解了ds的存放空间。ds是段寄存器,其偏移地址为0,因此要注意内存区的地址是ds:0,同时cs=ds+10h,加上了程序段前缀,psp用来程序间的通信,因此指令部分需要从cs:ip指向的内存空间开始。对这一知识点有了更深刻的理解。

(3)在实验中也遇到了一些困难和错误,因为一些路径放置和代码编写问题困扰了很久,通过尝试修改路径等方法解决了问题,很好的锻炼了动手编写代码的能力。

 

 

posted @ 2021-10-27 21:44  陆晨曦  阅读(92)  评论(3)    收藏  举报