1.实验任务1
略
2.实验任务2
利用d命令查看生产日期为01/01/92
试图利用e命令修改生产日期,并用d命令再次查看,发现生产日期没有改变
结论:生产日期不可修改,是由于该内存地址为ROM,ROM中的信息不可被更改
3.实验任务3
用e命令向指定内存单元b800:0填写数据 04 03,重复五次;可在左上角观察到输出结果“5个红色爱心”,结果如下:
再用f命令向指定内存单元b800:0f00重复填写数据04 03
使用d命令观察到数据已经被写入到内存中,但没有任何输出结果
修改b800:0 9中的数据,观察到不同的输出结果
造成上述情况的原因是:在8086中,地址A0000H~BFFFFH为显存地址空间,数据会呈现为输出结果显示在输出设备上
4.实验任务4
利用e命令,修改00200H~00207H内存单元中的数据为10 20 30 40 50 60 70 80
填空:
-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
1)在t命令单步执行后,执行push指令SP=SP-2,执行pop指令SP=SP+2;
mov ss,ax和mov sp,30执行后,
栈顶的逻辑地址为:0020:0030,实际地址为:00230H
2)在执行完push[6],且还未执行pop[6]时,用d命令查看栈内存中数据如下:
3)在执行完pop[0],用d命令查看栈内存中数据如下:
4)改变后四条指令如下:
发现数据空间内的数据呈倒序排列:
5.实验任务5
问题1:用t命令执行mov ss,ax后没有暂停,mov sp,30紧接着得到执行
即Debug的T命令在执行修改寄存器SS的指令时,下一条指令也紧接着被执行
问题2:00220H~0022fH被设置为栈,且值均为0,
程序段中将栈顶指针设为了0020:0030,指向栈的中间
CS:IP与栈中值相同,即第一条程序存放在栈中
6.实验任务6
编写如下8086汇编程序源码
task6.asm
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
汇编链接过程截图
可执行程序task6.exe执行结果:
在debug中,用d命令查看PSP,前两个字节为CD 20
7.实验任务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:IP指向了第一条程序,因而若要复制整个程序,需要将段地址cs赋值给寄存器ds,所有第一个空为cs
除去最后两条返回指令,其余指令长度为17h(2+2+3+2+3+3+2+2+2+2=23=17h),cx中为控制循环次数的数
2)先使用u命令,查看反汇编代码
由LOOP的物理地址可知,用命令“g 076a:0017”将程序执行到loop s之后,mov ax,4c00之前
然后用u命令对0:200进行反汇编,得到结果:
得以验证该程序是正确的