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

任务2:

使用d命令查看生产日期的截图:

 

 

  使用e命令修改生产日期所在内存单元的截图

 

 查看是否修改成功

 

 

 

 结论:不能修改。这类系统地址无法通过软件修改

 

 任务3:

使用e命令修改内存单元的命令

 

 

  使用f命令批量填充内存单元的命令

 

 

 任务4:

-a
mov ax, 20
mov ds, ax
mov ss, ax
mov sp, 30
push [0] ; 执行后,寄存器(sp) = 010A
push [2] ; 执行后,寄存器(sp) = 010E
push [4] ; 执行后,寄存器(sp) = 0112
push [6] ; 执行后,寄存器(sp) = 0116
pop [6] ; 执行后,寄存器(sp) = 011A
pop [4] ; 执行后,寄存器(sp) = 011E
pop [2] ; 执行后,寄存器(sp) = 0122
pop [0] ; 执行后,寄存器(sp) = 0126

  

问题1:

指令 mov ss, ax 和 mov sp, 30 执行后,栈顶的逻辑地址是30 物理地址 0106:0030
 

问题2:

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

 

问题3:

pop [0] 执行结束后, pop [0] 指令执行结束后,使用d命令 d 20:0 7

 

 修改最后四条指令的顺序, pop [6] 指令执行结束后,使用d命令 d 20:0 7

 

 

 

问题1:

使用T命令执行mov ss,ax时,此时命令并没有暂停,而是接着执行它的下一条mov sp,30指令。

问题2:

根据汇编指令,前三条指令执行后,00220H~0022fH被设置为栈空间。

在ss和sp联合设置栈段时,不响应单步中断,以保证栈段的正确位置。

而且在中断时,会对现场进行保护,cpu先将标志寄存器进栈,在把当前的CS值进栈,最后将IP进栈。

因此出现了其他数据

 

 

任务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

使用masm、link对程序汇编链接过程截图,以及,运行可执行程序task6.exe的运行结果截图

 

在debug中查看task6.exe的程序段前缀PSP的截图

 

 

 任务7:

assume cs:code
code segment
mov ax, cs
mov ds, ax
mov ax, 0020h
mov es, ax
mov bx, 0
mov cx, 0017H
s: mov al, [bx]
mov es:[bx], al
inc bx
loop s
mov ax, 4c00h
int 21h

code ends
end

mov ax,cs;程序加载到内存时,cs:ip会初始化为程序的首个地址,而作为程序段的段值,ip为0,所以通过ax将cs的值赋值给ds.

mov cx,0017h;通过先在此位置填0测试得出.

 

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

 

 复制成功了

五.实验总结

(1)Debug的T命令在修改ss时,下一条指令也随之执行.

(2)u命令可用于反汇编.方法是u[范围]

(3)t命令可实现控制命令的单步执行

posted @ 2021-10-24 10:10  居林超  阅读(48)  评论(2编辑  收藏  举报