实验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的代码复制到了目标内存空间:

复制完成。

posted @ 2021-10-24 11:31  dd摇摆  阅读(113)  评论(2)    收藏  举报