实验1 8086汇编指令编码和调试

1. 实验任务1
【跳过】
2.实验任务2
·在debug中,使用d命令查询FFF00H ~ FFFFFH所有单元中的内容,我们发现在FFFF0~FFFFFH这段内存中存储着生产日期,为1992/01/01.
·使用e命令修改所在的内存单元:

 并未修改成功。原因是FFF00H~FFFFFH中内存单元中写入数据时无效的,因为等于改写只读存储器中的内容。

3. 实验任务3
在debug中,使用e命令,向内存单元填写数据。
-e b800:0 03 04 03 04 03 04 03 04 03 04
从b800:0开始的内存单元开始,依次写入十六进制数据04 03,重复写5次。
在debug中,使用f命令,向内存单元批量填写数据。
-f b800:0f00 0f9f 03 04
把内存单元区间b800:0f00 ~ b800:0f9f连续160个字节,依次重复填充十六进制数据03 04。 
4. 实验任务4:
填空:

问题一:逻辑地址为:0020:30,物理地址为:00230H

问题二:

 问题三:

 问题四:

5. 实验任务5
问题1:我通过debug测试发现指令mov ss,ax执行完后直接跳转至mov,sp,30指令之后,但是根据寄存器的情况,我们发现ss段的值被改变,说明指令得到了执行。

 根据书P74对此的描述,这个现象产生的原因可能是中断机制。

问题二:黄色下划线部分是之前已经在内存中cs:ip的值,所以只有最前面部分被ss段和f填充的值修改。

6. 实验任务6

 

该程序的功能为通过循环输出0~9;

 使用d命令我们发现psp的前两个字节确实为CD 20

7. 实验任务7

 (1)因为需要完成程序的自我复制所以ds所指向的地址应为程序段的地址cs;

每次复制一个字节,整个程序的大小存储在cx中,所以循环次数为cx的值。

assume cs:code
code segment
    mov ax,cs
    mov ds,ax
    mov ax,20h
    mov es,ax
    mov bx,0
    mov cx,cx
s:    mov al,[bx]
    mov es:[bx],al
    inc bx
    loop s
    
    mov ax,4c00h
    int 21h
code ends
end

我先将源程序反汇编:

使用g命令将程序执行到loops之后、movax,4c00h之前,

观察是否成功复制。

 

 

 

 

 

 

 

 
 

 

 

posted @ 2021-10-23 16:14  余|山  阅读(109)  评论(4)    收藏  举报