实验结论:
实验任务2:
1.d命令查看生产日期
2.尝试修改内存单元
发现指令并没有起到作用,日期没有发生改变。因为ROM为只读存储器,只能读取内存数据,不能修改数据。
实验任务3:
1.使用e命令,向内存单元填写数据
2.使用f命令,向内存单元批量填写数据
实验任务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 查看此 时栈空间数据
4.问题三
汇编指令 pop [0] 执行结束后, pop [0] 指令执行结束后,使用d命令 d 20:0 7 查看此 时数据空间内的数据是否有变化
发现数据空间内的数据没有变化
5.问题四
如果把最后四条指令改成截图中的顺序, pop [6] 指令执行结束后,使用d命令 d 20:0 7 查看此时数据空间内的数据是否有变化
如果改变最后四个指令的顺序,那么数据空间内的数据会发生变化。
实验任务5
1.问题一
使用t命令单步执行 mov ss, ax 时,是单步执行完这一条指令就暂停了吗?后面的指令 mov sp, 30 是什么时候执行的?
使用t命令单步执行mov ss,ax时,不是执行到这一条指令就暂停,mov sp,30紧跟着执行。因为cpu在执行过程中,不响应中断请求,所以不响应t命令中断。
2.问题二
根据汇编指令,前三条指令执行后,00220H ~ 0022fH被设置为栈空间。并且,初始时,已通 过f命令将初始栈空间全部填充为0。观察单步调试时,栈空间00220H ~ 0022fH内存单元值的变化,特 别是图示中黄色下划线表示出的数据值
在使用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
编译
连接
运行
在debug中查看task5.exe的程序段前缀PSP
程序段前缀为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次。
确认是否复制
通过反汇编查看复制成功。
实验总结
1.栈的存储方式为先进先出,使用push命令时,首先减少sp的值然后将数据放入栈中,使用pop命令时,先取出数据,然后sp增加。
2.在debug调试中,发现程序中断时,cs:ip中存储的为下一条指令的段地址。