8086汇编指令编码和调试

实验结论:

实验任务2:

  1.d命令查看生产日期

8086汇编指令编码和调试

 

  2.尝试修改内存单元

 

8086汇编指令编码和调试

 

 

 发现指令并没有起到作用,日期没有发生改变。因为ROM为只读存储器,只能读取内存数据,不能修改数据。

 实验任务3:

  1.使用e命令,向内存单元填写数据

8086汇编指令编码和调试

  2.使用f命令,向内存单元批量填写数据

8086汇编指令编码和调试

 

 

 实验任务4

  1.填空

 

 

-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.问题一

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

  3.问题二

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

8086汇编指令编码和调试

 

 

   4.问题三

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

8086汇编指令编码和调试

 

 

 发现数据空间内的数据没有变化

  5.问题四

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

8086汇编指令编码和调试

 

 

 如果改变最后四个指令的顺序,那么数据空间内的数据会发生变化。

实验任务5

8086汇编指令编码和调试

 

 

 

  1.问题一

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

使用t命令单步执行mov ss,ax时,不是执行到这一条指令就暂停,mov sp,30紧跟着执行。因为cpu在执行过程中,不响应中断请求,所以不响应t命令中断。

   2.问题二

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

8086汇编指令编码和调试

 

8086汇编指令编码和调试

 

 

 在使用debug的t命令进行单步中断时,需要使用部分的栈空间暂存下一条命令的逻辑地址,在上图中,0801为ip偏移地址,3F07为段地址。

实验任务6

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

编译

8086汇编指令编码和调试

 

 连接

8086汇编指令编码和调试

 

 运行

8086汇编指令编码和调试

 

 在debug中查看task5.exe的程序段前缀PSP

8086汇编指令编码和调试

 

 

 程序段前缀为CD 20.

实验任务7

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中存贮的代码开始的段地址通过寄存器ax赋值给ds

空2:寄存器cx控制的是s语句的循环次数,通过计算mov ax,4c00h之前的代码字节数,可以得出循环为17次。

确认是否复制

8086汇编指令编码和调试

 

 

 通过反汇编查看复制成功。

实验总结

1.栈的存储方式为先进先出,使用push命令时,首先减少sp的值然后将数据放入栈中,使用pop命令时,先取出数据,然后sp增加。

2.在debug调试中,发现程序中断时,cs:ip中存储的为下一条指令的段地址。

 

上一篇:实验1 8086汇编指令编码和调试


下一篇:栈的应用---括号的匹配和算术表达式的计算