1. 实验任务1:使用8086汇编程序编写、汇编、链接、运行、调试方法,对task1.asm进行汇编、链接、运行,使用debug工具调试可执行文件。
1)编写task1.asm文件

2)汇编、链接得到可执行文件,并执行

3) 使用debug工具对程序进行调试
使用r命令+u命令精准反汇编

使用d命令查看数据段
![]()
4)修改task1.asm并运行

运行结果

5)基于观察、分析,猜测这里的数值指示了显示字符的颜色
2.实验任务二:编写程序,在屏幕上以十进制整数形式打印输出5个两位数字(23, 50, 66, 71, 35)。
1)编写task2.asm

2)task2.asm运行结果

3.实验任务三:将task3.asm程序编译、连接,用debug加载、跟踪,然后回答问题
1)编写task3.asm
2)debug过程

运行到程序退出以前
3)回答问题:
CPU执行程序,程序返回前,data段中的数据为:23 01 56 04 89 07 BC 0A EF 0D ED 0F BA 0C 87 09
CPU执行程序,程序返回前,cs=076C, ss=0769, ds=075A
设程序加载之后, code段的段地址为X,则data段的段地址为X-1,stack段的段地址为X-2
4.实验任务四:将task4.asm程序编译、连接,用debug加载、跟踪,然后回答问题
1)编写task4.asm

2)debug过程

运行到程序退出以前

3)回答问题:
CPU执行程序,程序返回前,data段中的数据为:23 01 56 04
CPU执行程序,程序返回前,cs=076C, ss=0769, ds=075A
设程序加载之后, code段的段地址为X,则data段的段地址为X-1,stack段的段地址为X-2
对于如下定义的段:
name segment
...
name ends
如果段中数据占N个字节,则程序加载之后,该段实际占有的空间为 ?N/16?*16 字节
5.实验任务五:将task5.asm程序编译、连接,用debug加载、跟踪,然后回答问题
1)编写task5.asm

2)debug过程

运行到程序退出以前

3)回答问题:
CPU执行程序,程序返回前,data段中的数据为:23 01 56 04 89 07 BC 0A EF 0D ED 0F BA 0C 87 09
CPU执行程序,程序返回前,cs=076A, ss=0769, ds=075AA
设程序加载之后, code段的段地址为X,则data段的段地址为X-1,stack段的段地址为X-2
代码中data段和stack段位置的不同会影响这两个段的数据存储的相对位置。
如果data段和stack段在code段前面,那么实际存储的过程中段地址stack=code-1,data=code-2;
如果data段和stack段在code段后面,那么实际存储的过程中段地址stack=code+代码长度+1,data=code+代码长度+2;
6.实验任务六:如果将(1)、(2)、(3)题中的最后一条伪指令”end start“改为”end“也就是说不知名程序的入口),则哪个程序任然可以正确执行?请说明理由。
(3)题中的程序可以正确执行,因为end start是指定程序的入口,如果删掉start,那么机器会将代码一开始作为程序的入口,但是(1)(2)中代码开始定义的是data段和stack段,只有(3)
将code段放在了开头,所以能够正确执行。
7.实验任务七:编写程序使程序实现将a段和b段中的数据依次相加,并将结果保存在c段中。
1)编写task7.asm

2)debug调试验证结果

8.实验任务八:编写程序使程序实现将a段中的前8个字型数据,逆序存储在b段中,要求使用push指令。
1)编写task8.asm

2)debug调试验证结果

1. 操作系统为在程序运行之初,为程序开辟的内存空间分为两部分,第一部分是数据段,第二部分是程序段,debug中cx寄存器指示两者总和,可以通过减去mov ah,4c00h占用的两个字节进行精确的反汇编,即仅提取程序段。
2. 数据段开辟的顺序与在代码中声明的顺序有关,先声明的先开辟,后声明的后开辟。
3. “end start”语句的作用是确定程序运行的入口,如果省略start会导致程序入口被机器确定在开头,这样会导致程序运行出错。
4. DOSBox可以将系统中指定目录映射到DOSBox中的D盘符,因此可以在DOSBox外使用文本编辑器直接编辑asm文件,而不必在DOSBox中使用命令行edit编辑文本内容。
原文:https://www.cnblogs.com/freedyool/p/14046455.html