实验任务1
略
实验任务2
(1)使用d命令查看生产日期,已知生产日期在内存FFF00H~FFFFFH的某几个单元中,使用命令d FFF0:0 FF查看对应的内存空间,可以看到有一串字符串为01/01/92,应为生产日期,如下图所示。
(2) 使用e命令修改相应的生产日期,尝试将日期改为1999年10月1日,命令为e FFF0:F5 30 31 2F 31 30 2F 39 32,再使用d命令进行查看,发现修改失败,如下图所示。
(3)修改失败的原因:由于8086CPU的ROM的内存地址空间为00000F~9FFFFH,题目所给的内存空间包含在其中,而ROM为只读存储器,故无法修改。
实验任务3
(1)在debug中使用e命令修改内存单元,命令为e b800:0 03 04 03 04 03 04 03 04 03 04,效果如下图所示。
(2)在debug中使用f命令批量填充内存单元,命令为f b800:0f00 0f9f 03 04,效果如下图所示。
(3)前两条命令修改的内存单元都在显存地址空间,所以在屏幕的相关位置会有内容显示,再次修改内存单元,使用命令e b800:0 f9 03 04,效果如下图所示。
实验任务4
(1)填空
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)回答问题
问题1:题目要求是把00220H ~ 0022fH用作栈空间。指令 mov ss, ax 和 mov sp, 30 执行后, 栈顶的逻辑地址和物理地址分别是?
答:栈顶的逻辑地址为0022:0030,物理地址为00230H。
问题2:单步调试到汇编指令 push [6] 执行结束, pop [6] 执行之前,使用 d 20:20 2f 查看此 时栈空间数据,给出实验截图。
答:如图所示。
问题3:汇编指令 pop [0] 执行结束后, pop [0] 指令执行结束后,使用d命令 d 20:0 7 查看此 时数据空间内的数据是否有变化。给出实验截图。
答:数据没有变化,如图所示。
问题4:如果把最后四条指令改成截图中的顺序, pop [6] 指令执行结束后,使用d命令 d 20:0 7 查看此时数据空间内的数据是否有变化。给出实验截图。
答:数据有变化,字的顺序发生了颠倒,如图所示。
实验任务5
执行结果如图所示。
问题1:使用t命令单步执行 mov ss, ax 时,是单步执行完这一条指令就暂停了吗?后面的指令 mov sp, 30 是什么时候执行的?
答:单步执行完mov ss, ax后,mov sp, 30立刻被执行了,从截图中可以看出在mov ss, ax执行后SP已经变成了30,同时紧接着执行的下一条指令变成了mov ax, 2010。这是因为要确保段寄存器SS和栈指针的修改不被破坏。
问题2:根据汇编指令,前三条指令执行后,00220H ~ 0022fH被设置为栈空间。并且,初始时,已通过f命令将初始栈空间全部填充为0。观察单步调试时,栈空间00220H ~ 0022fH内存单元值的变化,特别是图示中黄色下划线表示出的数据值。根据实验观察,尝试思考和分析原因。
答:
前者因为每一次执行t命令指令所指向的地址都会变化,073F及后面的偏移地址所表示的地址就是当前指令所在的地址。
后者随着程序执行,数据入栈,原先在栈中的数据跟着往前移。
实验任务6
- 源程序
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
- 给出使用masm、link对程序汇编链接过程截图,以及运行可执行程序task5.exe的运行结果截图,如图所示。
- 给出在debug中查看task5.exe的程序段前缀PSP的截图,如图所示。
实验任务7
-
源程序
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中,我们要将其复制到ds中作为数据段,故将cs通过ax间接赋值给ds,第一空填cs。
因为mov指令在寄存器间赋值时占用2个字节的空间,直接数给寄存器赋值时占用3个字节的空间,其余的指令都占用2个字节的空间,故相加可得2+2+3+2+3+3+2+2+2+2=23=17H,第二空填17h。
-
在debug中调试,使用g命令将程序执行到loop s之后、mov ax, 4c00h 之前,然后,使用u命令对0:200开始的内存单元反汇编,确认是否把task7.asm中line3-line12的代码复制到了目标内存空间,如图所示。
实验总结
(1)使用debug调试时,不能修改前面的指令,导致输错了一个地方只能重来,在实验任务五的书写上浪费了一定的时间。
(2)在实模式下,可以通过程序对内存直接进行操作,虽然方便但没有进行保护,相对的并不安全。
(3)在实模式下,对内存直接进行操作,通过改写显存地址空间里的内容,感受最为直观。