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

2021/10/29 1:39:41

本文主要是介绍实验1 8086汇编指令编码和测试,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

汇编语言实验

一、8086汇编指令编码和调试

2. 实验任务2 

  1. 使用 d 命令在 debug 模式下查看内存内容,代码如下:
    1 -d FFF0:0 FF

    得到结果:

     查得日期:01/01/92

  2. 使用 e 命令修改内存中的内容,并使用 d 命令查看结果,代码如下:
    -e FFF0:00F0 01 02 03 04 05 06 07 08 09 
    -d FFFF:0 F

    得到结果:

     发现没有发生修改,FFF00H~FFFFFH 对应地址空间为 ROM地址空间,意为只读不写,进行写入操作不会改变内存内容3.实验

3.实验任务3

  1. 用 e 命令,向内存单元b800:0重复写入数据03 04,指令如下,意为从 b8000:0 开始的内存单元开始,依次写入十六进制数据 04 03,重复写 5 次:
    1 -e b800:0 03 04 03 04 03 04 03 04 03 04

     得到结果如下,显示在左上角:

  2.  

    用 f 命令,向内存单元批量填写数据,指令如下,意为把内存单元区间b800:0f00~b800:0f9f连续 160 个字节依次重复填充十六进制数据03 04:

    1 -f b800:0f00 0f9f 03 04

    得到结果:显示在下方:

     

4. 实验任务4

已知内存单元 00201H ~ 00207H 分别存放数据(如下图所示),00220H ~ 0022fH 用作栈空间。

  1. 按顺序录入以下内容,观察结果:
     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__

     

  2. push [6] 指令执行结束后,pop [6] 指令执行结束前,使用 d 命令查看此时栈空间的数据,指令如下:

    1 -d 20:20 2f

    查看数据变化情况:

     

  3. pop [0] 指令执行结束后,使用 d 命令查看此时数据空间内的数据是否有变化,指令如下:

    1 -d 20:0 7

    查看数据变化情况:

     

  4.  把最后四条指令改成截图中的顺序, pop [6] 指令执行结束后,使用d命令查看此时数据空间内的数据是否有变化,指令如下:

    1 -d 20:0 7

    查看数据变化情况:

     

5. 实验任务5

先使用f命令,把 00220H ~ 0022fH 区间的 16 个字节内存单元值全部修改为 0,并使用 d 命令查看确认,然后使用 a 命令、r 命令、t 命令写入汇编指令并单步调试。

  1. 使用 t 命令单步执行 mov ss, ax 时,不是单步执行完这一条指令就暂停,后面的指令 mov sp, 30 在执行 mov ss, ax 后执行。实验结果:

     

  2. 根据汇编指令,前三条指令执行后,00220H~0022FH 被设置为栈空间,并且初始时已通过 f 命令将初始栈空间全部填充为 0。观察单步调试时,栈空间 00220H~0022FH内存单元值的变化,特别是图示中黄色下划线表示出的数据值,得到结果如下:

     分析:进行t命令的单步执行操作时发生中断时,使用栈空间存储CS IP,存放cpu关键中断数据。

6. 实验任务6

  1. 使用任何一款文本编辑器,编写8086汇编程序源码。

 

 1 ; task6.asm
 2 assume cs:code
 3 code segment
 4 start:
 5     mov cx, 10
 6     mov dl, '0'
 7 s:  mov ah, 2
 8     int 21h
 9     add dl, 1
10     loop s
11     mov ah, 4ch
12     int 21h
13 code ends
14 end start

使用 masm、link,汇编、链接,得到可执行文件 task6.exe,运行程序,得到结果:

 

得到结果0123456789,表示从0到9输出(dl循环10次+1操作)。

 

 2. 

使用 debug 工具,调试 task6.exe。根据第 4 章所学知识,任何可执行程序在执行时,都有一个引导程序负责将其加载到内存,并将CPU控制权移交给它,也即将 CS IP 指向可执行程序中第一条机器指令。在加载可执行程序时,可执行前面 512 字节是程序段前缀PSP(Program Segment Prefix),用于记录程序一些相关信息。 在debug中,使用 d 命令,查看 task6.exe 的程序段前缀,观察这 256 个字节的内容,证实实验结果:两个字节为 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, _17h_
 9 s:  mov al, [bx]
10     mov es:[bx], al
11     inc bx
12     loop s
13     mov ax, 4c00h
14     int 21h
15 code ends
16 end

分析:代码段寄存器cs:存放程序的段地址,用寄存器ax将代码段寄存器cs的值赋给数据端寄存器ds;代码到mov ax, 4c00h的长度共23个字节,转换16进制 -> 17h。

在 debug 中调试,使用 g 命令:将程序执行到 loop s 之后、 mov ax, 4c00h 之前:

 

 然后,使用 u 命令对 0:200h 开始的内存单元反汇编:

 

确认把 task7.asm 中 line3-line12 的代码复制到了目标内存空间。



这篇关于实验1 8086汇编指令编码和测试的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程