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


实验任务2
(1)在debug中,使用d命令查看生产日期
(2)使用e命令修改生产时期所在的内存单元,修改后,再次使用d命令查看
 
重启debug,可见未发生变化
结论:ROM内存单元是只读的,不可以修改。

实验任务3

(1)在debug中使用e命令修改内存单元

(2)在debug中使用f命令批量填充内存单元
 A0000~BFFFF的内存单元为显存地址空间,写入其中的数据会被显示卡输出到显示器上
A0000h - AFFFFh是图形模式(Graphic Mode)的显存
B0000h - B7FFFh是黑白文字模式(Mono Text Mode)的显存
B8000h - BFFFFh是彩色文字模式的显存
实验任务4
已知内存单元00201H~00207H中数据如下,用作栈空间:

 

输入指令进行单步跟踪

-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. 逻辑地址:0020:30H 物理地址:00230H

2. 执行到pop[6]前,SP应为执行到PUSH[6]后的值,为2A-2=28

3. pop[0]执行结束后,SP应为pop[0]执行前的2E-2=2C

 
4. 最后4条指令翻转后,会变成70 80 50 60 30 40 10 20

 

实验任务5

输入如下内容

 

 

 

1. 程序没有暂停,所有对ss寄存器进行值修改的指令执行后,都紧接着执行其下一行指令的修改,所以紧接着执行mov sp 30,显示下一条为mov ax,2010,debug的单步调试就是一种中断,而CPU在此期间不响应中断

2.  0108是偏移地址IP,150F是程序段地址CS,因为中断时需要保存原来程序的入口

 

实验任务6

 

使用masm、link,汇编、链接,得到可执行文件task5.exe。运行程序。结合程序运行结果,理解程序功能。

 

在debug中,使用d命令,查看task6.exe的程序段前缀,观察这256个字节的内容,验证前两个字节是否是CD 20

 

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
输出 结果为0123456789
161F :0000处确实为CD 20,以及程序名在161F:0080

实验任务7

下面程序的功能是,完成自身代码的自我复制:把 mov ax, 4c00h 之前的指令复制到内存0:200开始的 连续的内存单元。 补全程序,并在debug中调试验证,确认是否正确实现了复制要求

assume cs:code
code segment
mov ax, cs mov ds, ax  ;数据段就是程序段
mov ax, 0020h
mov es, ax
mov bx, 0
mov cx, cx; cxw为程序长度
s: mov al, ds:[bx]
mov es:[bx], al
inc bx
loop s
mov ax, 4c00h
int 21h
code ends
end
复制成功


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM