实验: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

sp, 30 是什么时候执行的?

回答:执行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

 

posted @ 2021-10-24 15:08  小小神龙  阅读(58)  评论(3)    收藏  举报