实验:8086汇编指令编码和调试
实验任务一
1.-d 查看内存单元
2.-r 查看并修改CPU寄存器的内容
3.-e 改写内存内容
4.-t 执行一条机器指令
5.-a 以汇编指令的格式向内存中写入一条机器指令
6.-u 将机器指令翻译成汇编指令
实验任务二
1.使用d命令查看生产日期

2.使用e命令修改生产日期所在内存单元

3.结论
ROM可读不可写,因此不可改变ROM地址对应的内容
实验任务三
1.e命令修改内存单元

2.f命令批量填充内存单元

实验任务四
-a mov ax, 20 mov ds, ax mov ss, ax mov sp, 30 push [0] ; 执行后,寄存器(sp) = 2E push [2] ; 执行后,寄存器(sp) = 2C push [4] ; 执行后,寄存器(sp) = 2A push [6] ; 执行后,寄存器(sp) = 28 pop [6] ; 执行后,寄存器(sp) = 2A pop [4] ; 执行后,寄存器(sp) = 2C pop [2] ; 执行后,寄存器(sp) = 2E pop [0] ; 执行后,寄存器(sp) = 30
1.单步执行push指令和pop指令时,观察并记录栈顶偏移地址的寄存器sp值的变化情况


2.push[6]执行后pop[6]执行前,此时栈空间的数据
![]()
3.pop[0]执行后,使用d 20:0 7查看此时数据是否有变化

4.改变pop顺序,观察数据变化

实验任务五
问题一:使用t命令单步执行 mov ss, ax 时,是单步执行完这一条指令就暂停了吗?后面的指令 mov
回答:执行mov ss, ax 时,mov sp,30立即执行,并没有暂停

问题二:观察单步调试时,栈空间00220H ~ 0022fH内存单元值的变化。
内存单元存储指令的地址


实验任务六
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
汇编、链接、运行的过程:

段前缀PSP:前两个字节的内容是CD 20

实验任务七
(1)mov ax,cs目的是让ds得到代码段的起始地址
(2)mov cx,offset s2 - offset s1 目的是将代码的首尾相减,得到代码段的位移
1 assume cs:code 2 code segment 3 s1: 4 mov ax,cs 5 mov ds,ax 6 mov ax,0020h 7 mov es,ax 8 mov bx,0 9 mov cx,offset s2 - offset s1 10 s: mov al,[bx] 11 mov es:[bx],al 12 inc bx 13 loop s 14 s2: 15 mov ax,4c00h 16 int 21h 17 18 code ends 19 end
结果截图:

总结:
(1)CPU当中对RAM与ROM的读写权限是不同的,RAM可读可写,ROM却只可读操作。
(2)段前缀用于显示指明内存单元的段地址,防止向其他内存空间写入数据,覆盖原本重要的数据。
(3)push指令 -> ①SP - 2 –> ②将字型数据存放到SS:SP地址中
pop指令 –> ①将SS:SP地址的字型数据取出来 –> ②SP + 2
浙公网安备 33010602011771号