你才是咕咕咕呢

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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

实验结论

1.实验任务2

分析:

  • 使用d命令查看生产日期,可以发现查阅到的信息为1992.01.01。
  • 使用e命令可以对制定内存处进行修改,这里将日期信息更改为2021.10.22。
  • 可以发现日期信息并没有修改,本质上是因为ROM为只读存储器,向ROM中写入数据的操作是无效的。

2.实验任务3

(1)使用e命令向内存单元填写数据:

(2)使用f命令向内存单元批量填写数据:

(3)修改了2000:0~2000:9的内存单元,结果如下:

3.任务实验4

(1)写入如下汇编指令:

 

分析:

  • 用e指令将00200H~00207H的内存分别置为10,20,30,...,80。
  • 将20作为数据段段地址。
  • 将20和30存入栈段寄存器ss和sp中,当前栈顶指针位于20:30处。
  • 分别将数据10,30,50,70入栈,栈顶指针执行了4次"sp-2",当前栈顶指针应该位于20:28。
  • 分别将数据70,50,30,10出栈,栈顶指针执行了4次"sp+2",当前栈顶指针又回到20:30。
 1 -a
 2 mov ax,20
 3 mov ds,ax
 4 mov ss,ax
 5 mov sp,30
 6 push [0]        ;执行后,寄存器(sp)=2e
 7 push [2]        ;执行后,寄存器(sp)=2c
 8 push [4]        ;执行后,寄存器(sp)=2a
 9 push [6]        ;执行后,寄存器(sp)=28
10 pop [6]         ;执行后,寄存器(sp)=2a
11 pop [4]         ;执行后,寄存器(sp)=2c
12 pop [2]         ;执行后,寄存器(sp)=2e
13 pop [0]         ;执行后,寄存器(sp)=30

(2)使用t命令逐步执行每行命令,

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

可以发现数据10,30,50,70被放于正确的位置,且sp位于28,与估计的一致。

 (3)

 

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

可以发现数据空间内的数据没有变化,sp回到了30,与估计一致。

(4)

 

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

可以发现数据发生了改变,为什么会这样呢?因为出栈的数依次为70,50,30,10,而替换到的位置上的数为10 30 50 70。

4.任务实验5

(1)实践一下内容:

 

 

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

(2)问题:

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

mov ss,ax和mov sp,30是连续执行的。由于dubug单步调试就是一种中断,而CPU在执行期间不响应中断请求,因此debug显示的是CPU执行完栈段和栈顶指针分配后的情况。

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

"073F:0108“对应的是"CS:IP",前者为指令的段地址,后者为指令的偏移地址。由于存在中断请求,因此需要保存原程序的入口。

5.任务实验6

(1)编写8086汇编程序源码:

 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)使用masmlink对程序汇编链接:

(3)运行结果如下所示:

(4)查看程序段前缀:

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

检验结果表明前两个字节为CD 20。

6.任务实验7

(1)补充完整的8086汇编程序源码部分:

assume cs:code
code segment
    mov ax,cs
    mov ds,ax
    mov ax,0020h
    mov es,ax
    mov bx,0
    mov cx,17h
s:  mov al,[bx]
    mov es:[bx],al
    inc bx
    loop s

    mov ax,4c00h
    int 21h
code ends
end

分析:

1.空一:cs为代码段的基地址,赋给ds作为复制段的基地址。

2.空二:cx用于控制循环次数,由于总的代码段为001CH字节,而move ax,4c00H和int 21h占用了5h字节,所以line3~line12代码段为0017字节。

(2)代码复制:

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

可以发现,实现了task7.asm中line3~line12的代码复制。 

posted on 2021-10-22 20:20  你才是咕咕咕呢  阅读(161)  评论(2)    收藏  举报