四、实验结论
2.实验任务2
(1)使用d命令查看生产时期的截图
(2)使用e命令修改生产日期所在内存单元以及修改后再次使用d命令查看的截图
(3)结论:不能修改。使用e命令修改生产时期所在的内存单元的操作是无效的,因为这等于改写只读存储器的内容。
3.实验任务3
(1)使用e命令修改内存单元的命令:
e b800:0 03 04 03 04 03 04 03 04 03 04
效果截图:
(2)使用f命令批量填充内存单元的命令
f b800:0f00 0f9f 03 04
效果截图:
(3)修改内存单元和数据的命令如下:
e b810:a 04 03 04 03 04 03
效果截图:
4.实验任务4
(1)填空
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
(2)问题1:
栈顶的逻辑地址:0020:0030
栈顶的物理地址:0020*16+0030=00230h
问题2:实验截图如下:
问题3:没有变化。
实验截图如下:
问题4:按字来看,数据顺序与原来相反。
实验截图如下:
5.实验任务5
(1)问题1:使用t命令单步执行mov ss, ax时,单步执行完这一条指令没有暂停。因为Debug的T命令在执行修改寄存器SS的指令时,下一条指令也紧接着被执行。所以指令mov sp, 30紧接着上一条指令被执行了。
(2)问题2:黄色下划线表示的是CS:IP,在数据进栈的同时,存储的位置也发生了改变。
6.实验任务6
(1)程序源码:
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的截图:
前两个字节是CD 20 。
7.实验任务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
第一个空填cs
依据:CS:IP指向要执行的指令(即本题中要复制的代码)。
第二个空填17h
依据:task7.asm中line3-line12的代码占据了17h个单元,一开始寄存器CX中存储的是循环的次数。
(2)使用g命令运行到指定点和使用u命令反汇编0:200到复制代码长度这一段内存空间的截图:
五、实验总结
收获:
向 ROM(只读存储器)中写入数据的操作是无效的。
Debug的T命令在执行修改寄存器SS的指令时,下一条指令也紧接着被执行。
尚存的问题:
实验任务5中的问题2,对于存储CS:IP的位置移动的原因尚未清楚。