实验1 8086汇编指令编码和调试
实验内容
2.实验任务2
(1)在debug中,使用d命令查看生产日期,生产日期为92年1月1日。

(2)使用e命令修改生产时期所在的内存单元,修改后,再次使用d命令查看,发现生产日期并未改变。

(3)
现象:FFFF0~FFFFF内存单元中的内容并未被修改。
原因:在8086PC机中,C0000 ~FFFFF的空间是ROM的地址空间,我们改写FFFF0~FFFFF的内存单元是无效的,因为这等于改写只读存储器中的内容。
3.实验任务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)使用f命令,向内存单元批量填写数据。

4.实验任务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)回答问题:
问题1:
栈顶的逻辑地址:0020H:0030H
栈顶物理地址:00230H
问题2:

问题3:
没有变化

问题4:
有变化

5.实验任务5
问题1.
使用t命令单步执行 mov ss, ax 时,并没有单步执行完这一条指令就暂停了,而是把指令 mov sp, 30也紧接着执行了。得出结论:debug的t命令在执行修改寄存器SS的指令时,下一条指令也紧接着被执行。



问题2.
根据实验观察,00220H ~ 0022fH作为栈空间使用时,系统会把寄存器的一些数据暂存在栈中,以供后续相关操作使用。经过查阅资料知道dos下系统只有一个栈,也就是说,外部操作未设置栈时,系统自己已经有一个栈在做暂存等相关工作了,当外部进行设置时,暂存等工作就发生在新栈中,因此没有进行push前系统已经先用来暂存相关数据了,这就是我们看到数据的原因。现在知道的暂存数据有cs:ip,ax,标志寄存器。
6.实验任务6
(1)程序源代码:
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
(2)给出使用masm、link对程序汇编链接过程截图,以及,运行可执行程序task5.exe的运行结果截图



(3)给出在debug中查看task5.exe的程序段前缀PSP的截图。这256个字节的内容,前两个字节是CD 20。

7.实验任务7
(1)
空一:将cs中的程序的段起始地址通过寄存器ax赋值给ds,所以第一个空是ax。
空二:首先预估一个值20h,然后根据下图的横线处,CX寄存器中存放的是程序的长度是17个字节,所以第二个空是17h。
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

(2)对0:200h开始的内存单元反汇编,发现成功实现把task7.asm中line3-line12的代码复制到了目标内存空间。

实验总结:
(1)通过本次实验,加深了对e命令(修改内存内容),f命令(向内存单元批量填写数据),d命令(查看内存中的内容)、u命令(反汇编命令)等命令的理解与使用方法。
(2)进一步掌握了汇编语言源程序编写→汇编→链接→调试的工具和方法。
(3)在数据入栈和出栈时,对SS:SP的指向变化有了更清晰的认识。

浙公网安备 33010602011771号