实验2 多个逻辑段的汇编源程序编写与调试
一、实验目的
1. 理解和掌握8086多个逻辑段的汇编源程序
2. 理解和熟练应用灵活的寻址方式
3. 通过汇编指令loop的使用理解编程语言中循环的本质,掌握其在嵌套循环中的正确使用
4. 掌握使用debug调试8086汇编程序的方法
二、实验准备
复习教材5-8章:
包含多个逻辑段的汇编源程序结构
寻址方式
汇编指令loop, div用法
三、实验内容
1. 实验任务1
此实验任务中,包含4个子任务。逐一实践,结合实践观察、验证,回答问题。
任务1-1
对程序task1_1.asm进行汇编、连接,用debug加载、跟踪调试,基于结果,回答问题。

① 在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = _076A___, 寄存器(SS) =
_076B___, 寄存器(CS) = _076C___
② 假设程序加载后,code段的段地址是X,则,data段的段地址是_X-2___, stack的段地址是_X-1___。
任务1-2
对程序task1_2.asm进行汇编、连接,用debug加载、跟踪调试,基于结果,回答问题。

① 在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = _076A___, 寄存器(SS) =
_076B___, 寄存器(CS) = _076C___
② 假设程序加载后,code段的段地址是X,则,data段的段地址是_X-2___, stack的段地址是_X-1___。
任务1-3
对程序task1_3.asm进行汇编、连接,用debug加载、跟踪调试,基于结果,回答问题。

① 在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = _076A___, 寄存器(SS) =
_076C___, 寄存器(CS) = _076E___
② 假设程序加载后,code段的段地址是X,则,data段的段地址是_X-4___, stack的段地址是_X-2___。
任务1-4
对程序task1_4.asm进行汇编、连接,用debug加载、跟踪调试,基于结果,回答问题。

① 在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = _076C___, 寄存器(SS) =
_076E__, 寄存器(CS) = _076A___
② 假设程序加载后,code段的段地址是X,则,data段的段地址是_X+2___, stack的段地址是_X+4___。
任务1-5
基于上述四个实验任务的实践、观察,总结并回答:
① 对于如下定义的段,程序加载后,实际分配给该段的内存空间大小是 __16 × [N / 16] B__。
xxx segment db N dup(0) xxx ends
② 如果将程序task1_1.asm, task1_2.asm, task1_3.asm, task1_4.asm中,伪指令 end start 改成
end , 哪一个程序仍然可以正确执行?结合实践观察得到的结论,分析、说明原因。
程序task1_4.asm可以正确执行,因为end start指明了程序从start开始执行,而只有task1_4.asm的程序段在最上面.
2. 实验任务2
编写一个汇编源程序,实现向内存单元b800:0f00 ~ b800:0f9f连续160字节,依次重复填充十六进制数
据03 04。
assume cs:code code segment start: mov ax,0b800h mov ds,ax mov ax,0403h mov bx,0f00h mov cx,50h s: mov [bx],ax add bx,2 loop s mov ah,4ch int 21h code ends end start
运行截图:

3. 实验任务3
要求:
① 编程实现把逻辑段data1和逻辑段data2的数据依次相加,结果保存到逻辑段data3中。
② 在debug中加载、反汇编、调试。在数据项依次相加前,和相加后,分别查看三个逻辑段data1,
data2, data3对应的内存空间,确认逐一相加后,结果的确保存在了逻辑段data3中。
完整代码如下:
assume cs:code data1 segment db 50, 48, 50, 50, 0, 48, 49, 0, 48, 49 ; ten numbers data1 ends data2 segment db 0, 0, 0, 0, 47, 0, 0, 47, 0, 0 ; ten numbers data2 ends data3 segment db 16 dup(0) data3 ends code segment start:mov ax,data1 mov ds,ax mov bx,0 mov cx,0ah s:mov ax,[bx] add ax,[bx+10h] mov [bx+20h],ax inc bx loop s mov ah,4ch int 21h code ends end start
编译运行截图:

运行之前:

运行之后:

4. 实验任务4
要求:
① 补全程序,实现把逻辑段data1中的8个字数据逆序存储到逻辑段b中。
② 汇编、连接后,在debug中加载程序,运行到line15程序退出前,使用d命令查看数据段data2对应的
内存空间,确认是否实现题目要求。
assume cs:code data1 segment dw 2, 0, 4, 9, 2, 0, 1, 9 data1 ends data2 segment dw 8 dup(0) data2 ends code segment start: mov ax,data1 mov ds,ax mov bx,0 mov cx,8 s1: push [bx] add bx,2 loop s1 mov ax,data2 mov ds,ax mov bx,0 mov cx,8 s2: pop [bx] add bx,2 loop s2 mov ah, 4ch int 21h code ends end start
执行前:

执行后:

数据已经被逆序存放在data2处
5. 实验任务5
源码如下:
assume cs:code, ds:data data segment db 'Nuist' ;db 2, 3, 4, 5, 6 db 5 dup(2) data ends code segment start: mov ax, data mov ds, ax mov ax, 0b800H mov es, ax mov cx, 5 mov si, 0 mov di, 0f00h s: mov al, [si] and al, 0dfh mov es:[di], al mov al, [5+si] mov es:[di+1], al inc si add di, 2 loop s mov ah, 4ch int 21h code ends end start
阅读源程序,从理论上分析源代码的功能,尤其是line15-25,循环实现的功能是什么,逐行理解每条指
令的功能。
(1)对程序进行汇编、链接,得到可执行文件,运行并观察结果。
(2)使用debug工具对程序进行调试,执行到程序返回前,即line25执行之后、line27执行之前,观察
结果。
(3)源代码中line19的作用是?
(4)修改line4里5个字节单元的值,重新汇编、链接、运行,观察结果。
db 2,3,4,5,6 --> 改成: db 5 dup(2) 或 db 5 dup(5)
(1)运行结果为:

(2)返回之后运行结果为:

(3)line19的作用为输出的大小写转换
(4)修改后的运行结果为

所以line4的作用是改变输出颜色
6. 实验任务6
要求:
① 补全程序,将data段中的每行第一个单词从大写->小写。
② 在debug中加载程序,反汇编,执行到line13退出前,用d命令查看data段对应的内存空间,确认每
行第一个单词已经由大写->小写。
assume cs:code, ds:data data segment db 'Pink Floyd ' db 'JOAN Baez ' db 'NEIL Young ' db 'Joan Lennon ' data ends code segment start: mov ax,stack mov ss,ax mov sp,1 mov ax,data mov ds,ax mov ax,data mov es,ax mov cx,4 s: push cx mov cx,4 s2: mov al,es:[bx] or al,20h mov es:[bx],al inc bx loop s2 pop cx mov ax,es inc ax mov es,ax loop s mov ah, 4ch int 21h code ends end start
编译运行后查看:

完成大小写转换
7. 实验任务7
要求:
① 补全程序,实现题目要求,把年份、收入、雇员人数、人均收入,以结构化方式写入table段中。
表格中,每行数据,在逻辑段table中占16个字节,各项数据占据字节大小分配如下。期中,数据之间用
空格间隔。
② 汇编、连接后,在debug中加载、调试程序。灵活、合理使用u命令、g命令、d命令,显示刚开始逻
辑段table的数据信息,以及,结构化存入数据后,数据段table的数据信息,确认实现题目要求。
源代码:
assume cs:code, ds:data, es:table data segment db '1975', '1976', '1977', '1978', '1979' dw 16, 22, 382, 1356, 2390 dw 3, 7, 9, 13, 28 data ends table segment db 5 dup( 16 dup(' ') ) ; table ends code segment start: mov ax, data mov ds, ax mov ax, table mov es, ax mov bx, 0 mov si, 0 mov cx, 5 s0: mov ax, [si] mov es:[bx], ax mov ax, [si+2] mov es:[bx+2], ax add si, 4 add bx, 10h loop s0 mov bx, 0 mov si, 14h mov cx, 5 s1: mov ax, [si] mov es:[bx+5], ax mov ax, 0 mov es:[bx+5+2], ax add si, 2 add bx, 10h loop s1 mov bx, 0 mov si, 1eh mov cx, 5 s2: mov ax,[si] mov es:[bx+0ah], ax add si, 2 add bx, 10h loop s2 mov bx, 0 mov cx, 5 s3: mov ax, es:[bx+5] mov dx, es:[bx+5+2] div word ptr es:[bx+0ah] mov es:[bx+0dh], ax add bx, 10h loop s3 mov ah, 4ch int 21h code ends end start
反汇编:

原始数据:

结构化存入数据:


浙公网安备 33010602011771号