实验1 8086汇编指令编码和调试
1. 实验任务 1
debug中一些小tips:
1)命令大小写等价
2)数字默认十六进制,无需加H
3)ctrl+c终止命令执行
4)命令和参数之间可以没有分隔符
常用debug命令:
-r 显示或修改寄存器的值
-d 显示存储单元内容【-d 段地址:偏移地址 结尾偏移地址】
-e 修改存储单元内容
-f 批量修改存储单元内容
-a [地址]:从指定地址开始写入汇编指令【两次回车回到命令行】
-g 运行程序【-g=偏移地址 结尾偏移地址】
-t 单步执行程序,进入子程序【t=偏移地址,从该偏移地址开始单步执行】
-p 单步执行程序,子程序当成整体
-u 反汇编
2. 实验任务 2
在debug中使用d命令查看生产日期:

使用e命令修改生产日期:

原因分析:
生产日期所处内存地址位于8086PC机的ROM存储地址空间,只可读,不可被修改
3. 实验任务3
在debug中,使用e命令向内存单元填写数据:

在debug中,使用f命令批量向内存单元填写数据:

修改填入数据为 04 03:


相关知识:
内存地址空间中,B8000H~BFFFFH共32KB(分8页)的空间,为80×25彩色字符模式的显示缓冲区
一般情况下,显示第0页的内容,即B8000H~B8F9FH(160字节×25行=4000字节)
一行显示80个字符,每个字符占两个字节,低位字节存储字符的ASCII码,高位字节存储字符的属性

4. 实验任务 4
填空:
1 -a 2 mov ax, 20 3 mov ds, ax 4 mov ss, ax 5 mov sp, 30 6 push [0] ; 执行后,寄存器(sp) = 002e 7 push [2] ; 执行后,寄存器(sp) = 002c 8 push [4] ; 执行后,寄存器(sp) = 002a 9 push [6] ; 执行后,寄存器(sp) = 0028 10 pop [6] ; 执行后,寄存器(sp) = 002a 11 pop [4] ; 执行后,寄存器(sp) = 002c 12 pop [2] ; 执行后,寄存器(sp) = 002e 13 pop [0] ; 执行后,寄存器(sp) = 0030
问题一:
栈顶逻辑地址:20H:30H
栈顶物理地址:00230H
问题二测试结果:

问题三测试结果(数据无变化):

问题四测试结果(数据有变化):

相关知识:
1)push,pop指令的含义
2)向内存写一个字数据,规则是:高位字节放高地址,低位字节放低地址
5. 实验任务5
问题1:mov sp,30紧接着mov ss,ax自动执行了,这是为了对ss段寄存器和栈指针sp的修改不被破坏
问题2:观察发现,这部分数据存放着下一条指令的地址,猜测可能是在debug中执行t命令导致程序中断导致的。

6. 实验任务6
使用EDIT.COM编辑task6.asm文件:

masm汇编,link链接:

运行task6.exe:

debug中查看task6.exe程序段前缀PSP(前两个字节为CD 20):

7. 实验任务7
补充下列程序实现自身代码的复制:把 mov ax, 4c00h 之前的指令复制到内存0:200开始的连续的内存单元。
1 assume cs:code 2 code segment 3 mov ax, _cs_ 4 mov ds, ax 5 mov ax, 0020h 6 mov es, ax 7 mov bx, 0 8 mov cx, _0017h__ 9 s: mov al, [bx] 10 mov es:[bx], al 11 inc bx 12 loop s 13 mov ax, 4c00h 14 int 21h
第一空:CS存放代码段的首地址,应从此处开始复制
第二空:由CX知程序总长度为001CH,mov ax,4c00h占3个字节,int 21h占2个字节,所以line3-line12占0017H字节,因为是按字节复制,所以CX应赋值0017H

在debug中调试,使用g命令将程序执行到 loop s 之后、 mov ax, 4c00h 之前,然后,使用u命令 对0:200h开始的内存单元反汇编,确认是否把task7.asm中line3-line12的代码复制到了目标内存空间:

复制完成。

浙公网安备 33010602011771号