实验1 8086汇编指令代码和调试
1. 实验任务1
DosBox debug使用
- -r:查看、改变CPU寄存器的内容
- -d:查看内存中的内容
- -e:改写内存中的内容
- -u:将内存中的机器指令翻译成汇编指令
- -t:执行一条机器指令
- -a:以汇编指令的格式在内存中写入一条机器指令
用masm、link将edit的文件保存为.asm格式并编译为.obj格式,最终连接为.exe的可执行文件
2. 实验任务2
使用d命令查看生产时期的截图

可以看到生产日期为01/01/92。
使用e命令修改生产日期所在内存单元的截图,以及,修改后,再次使用d命令查看的截图
采用-e 起始地址 数据 数据...的形式修改生产日期所在单元

用-d查看生产日期所在单元

结论:不能修改生产日期所在的内存单元。
原因:向地址C000H~FFFFFH的内存单元中写入数据是无效的,因为它们是只读存储器ROM(Read-Only Memory。
3. 实验任务3
使用e命令修改内存单元的命令,及,效果截图

使用f命令批量填充内存单元的命令,及,效果截图

尝试修改内存单元,或,数据后的效果截图

4. 实验任务4
·填空
-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:题目要求是把00220H ~ 0022fH用作栈空间。指令 mov ss, ax 和 mov sp, 30 执行后, 栈顶的逻辑地址和物理地址分别是?
答:栈顶的逻辑地址是0020:0030H,物理地址是00230H。
问题2:单步调试到汇编指令push [6]执行结束,pop [6]执行之前,使用d 20:20 2f查看此时栈空间数据,给出实验截图。
问题3:汇编指令pop [0]执行结束后,使用d命令d 20:0 7查看此时数据空间内的数据是否有变化。给出实验截图。

答:没有变化。
问题4:如果把最后四条指令改成截图中的顺序,pop [6]指令执行结束后,使用d命令d 20:0 7查看此时数据空间内的数据是否有变化。给出实验截图。

答:有变化。这是由于出栈的顺序改变导致的。
5.实验任务5
问题1:使用t命令单步执行 mov ss, ax 时,是单步执行完这一条指令就暂停了吗?后面的指令 mov sp, 30 是什么时候执行的?
答:没有暂停,mov sp,30在执行mov ss,ax时被执行。Debug的T指令在执行修改寄存器SS的指令时,下一条指令也紧接着被执行。
问题2:根据汇编指令,前三条指令执行后,00220H ~ 0022fH被设置为栈空间。并且,初始时,已通过f命令将初始栈空间全部填充为0。观察单步调试时,栈空间00220H ~ 0022fH内 存单元值的变化,特别是图示中黄色下划线表示出的数据值。根据实验观察,尝试思考和分析原因。
答:debug使用t指令引发了中断,中断过程使用了当前栈空间存放cpu关键数据。
6. 实验任务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
使用masm、link对程序汇编链接过程截图,以及,运行可执行程序task6.exe的运行结果截图

在debug中查看task5.exe的程序段前缀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, __23___ s: mov al, [bx] mov es:[bx], al inc bx loop s mov ax, 4c00h int 21h code ends end
mov ax,cs 是指向要复制的程序段基址
mov cx,23 是控制循环次数为23次,mov指令用于寄存器间传递数据时为3字节,用于寄存器和立即数之间传递数据时为2字节。mov ax,cs 到 loop s 一共23字节。
使用-u反汇编,得知loop后的地址为076A:0017
使用g命令将程序执行到loop指令之后

用u命令反汇编0020:0开始的字节单元内容

可以看到复制成功
实验总结
1、asm->obj->exe
2、注意程序的地址写法



浙公网安备 33010602011771号