实验二 多个逻辑段的汇编源程序编写与调试
实验任务1
任务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中将执行到line9结束、line11之前,记录此时:寄存器(DS) = _076C_, 寄存器(SS) =
_076E_, 寄存器(CS) = _076A_
② 假设程序加载后,code段的段地址是X,则,data段的段地址是__X+2__, stack的段地址是
_X+4_。
任务1-5
xxx segment db N dup(0) xxx ends
基于上述四个实验任务的实践、观察,总结并回答:
① 对于如上定义的段,程序加载后,实际分配给该段的内存空间大小是 ____。
答:如果N是16的倍数 内存空间大小为N字节
否则,内存空间大小为((N%16)+1)*16个字节
② 如果将程序task1_1.asm, task1_2.asm, task1_3.asm, task1_4.asm中,伪指令 end start 改成
end , 哪一个程序仍然可以正确执行?结合实践观察得到的结论,分析、说明原因。
答:将伪指令修改为end后,task1_4.asm可以正常运行,而task1_1.asm、task1_2.asm、task1_3.asm都无法正常运行。如果不写start,程序将默认数据段的首地址为程序的初始地址,而因为task1_4.asm中代码段写在最前面,所以不会产生影响。
实验任务2
编写一个汇编源程序,实现向内存单元b800:0f00 ~ b800:0f9f连续160字节,依次重复填充十六进制数
据03 04。
代码如下:
1 assume cs:code 2 code segment 3 start: 4 mov ax,0b800h 5 mov ds,ax 6 mov bx,0f00h 7 mov dx,0403h 8 mov cx,80 9 10 s: mov ds:[bx],dx 11 inc bx 12 inc bx 13 loop s 14 mov ah,4ch 15 int 21h 16 17 code ends 18 19 end start
运行结果:
实验任务三:
① 编程实现把逻辑段data1和逻辑段data2的数据依次相加,结果保存到逻辑段data3中。
② 在debug中加载、反汇编、调试。在数据项依次相加前,和相加后,分别查看三个逻辑段data1,
data2, data3对应的内存空间,确认逐一相加后,结果的确保存在了逻辑段data3中。
代码如下:
1 assume cs:code 2 data1 segment 3 db 50, 48, 50, 50, 0, 48, 49, 0, 48, 49 ; ten numbers 4 data1 ends 5 6 data2 segment 7 db 0, 0, 0, 0, 47, 0, 0, 47, 0, 0 ; ten numbers 8 data2 ends 9 10 data3 segment 11 db 16 dup(0) 12 data3 ends 13 14 code segment 15 start: 16 mov ax,data1 17 mov ds,ax 18 mov ax,data2 19 mov es,ax 20 mov ax,data3 21 mov ss,ax 22 mov bx,0 23 mov cx,10 24 s: mov ax,ds:[bx] 25 add ax,es:[bx] 26 mov ss:[bx],ax 27 inc bx 28 loop s 29 30 mov ah,4ch 31 int 21h 32 code ends 33 end start
结果如图所示:
进行加法前,两个数据段的内存情况:
进行加法后,数据段data3的内存情况如图所示:
实验任务四:
① 补全程序,实现把逻辑段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(?) data2 ends code segment start: mov ax,data1 mov ds,ax ;data1地址给ds mov ax,data2 mov es,ax ;data2地址给es mov bx,0 mov cx,8 ;使用默认的SS:SP地址 s1: mov ax,ds:[bx] push ax inc bx inc bx loop s1 mov cx,8 mov bx,0 s2: pop ax mov es:[bx],ax inc bx inc bx loop s2 mov ah, 4ch int 21h code ends end start
实验结果如下:
实验任务五:
1 assume cs:code, ds:data 2 data segment 3 db 'Nuist' 4 db 2, 3, 4, 5, 6 5 data ends 6 7 code segment 8 start: 9 mov ax, data 10 mov ds, ax 11 12 mov ax, 0b800H 13 mov es, ax 14 15 mov cx, 5 16 mov si, 0 17 mov di, 0f00h 18 s: mov al, [si] 19 and al, 0dfh 20 mov es:[di], al 21 mov al, [5+si] 22 mov es:[di+1], al 23 inc si 24 add di, 2 25 loop s 26 27 mov ah, 4ch 28 int 21h 29 code ends 30 end start
阅读源程序,从理论上分析源代码的功能,尤其是line15-25,循环实现的功能是什么,逐行理解每条指
令的功能。
对程序进行汇编、链接,得到可执行文件,运行并观察结果。
使用debug工具对程序进行调试,执行到程序返回前,即line25执行之后、line27执行之前,观察
结果。
源代码中line19的作用是?
修改line4里5个字节单元的值,重新汇编、链接、运行,观察结果。
结果如下:
line19的作用是实现从小写字母(uist)到大写字母(UIST)的转变
line24的作用使字符显示出不同的颜色
实验任务六:
① 补全程序,将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, data mov ds, ax mov cx, 64;一行16个字节 mov bx, 0 s: or [bx], byte ptr 20h inc bx loop s mov ah, 4ch int 21h code ends end start
实验结果:
大写:
小写:
实验任务七:
① 补全程序,实现题目要求,把年份、收入、雇员人数、人均收入,以结构化方式写入table段中。
表格中,每行数据,在逻辑段table中占16个字节,各项数据占据字节大小分配如下。期中,数据之间用
空格间隔。
代码如下:
1 assume cs:code, ds:data, es:table 2 3 data segment 4 db '1975', '1976', '1977', '1978', '1979' 5 dw 16, 22, 382, 1356, 2390 6 dw 3, 7, 9, 13, 28 7 data ends 8 9 table segment 10 db 5 dup( 16 dup(' ') ) 11 table ends 12 13 code segment 14 start: 15 mov ax,data 16 mov ds,ax 17 mov ax,table 18 mov es,ax 19 mov bx,0 20 mov si,0 21 mov cx,5 22 23 s1: mov ax,ds:[bx] 24 mov es:[si],ax 25 add bx,2 26 add si,2 27 mov ax,ds:[bx] 28 mov es:[si],ax 29 add bx,2 30 add si,14 31 loop s1 32 33 mov bx,20 34 mov si,5 35 mov cx,5 36 s2: mov ax,ds:[bx] 37 mov es:[si],ax 38 add si,2 39 mov word ptr es:[si],0 40 add bx,2 41 add si,14 42 loop s2 43 44 mov bx,30 45 mov cx,5 46 mov si,10 47 s3:mov ax,ds:[bx] 48 mov es:[si],ax 49 add bx,2 50 add si,16 51 loop s3 52 53 mov bx,20 54 mov di,30 55 mov cx,5 56 mov si,13 57 58 s4: mov ax,ds:[bx] 59 mov dx,0 60 div word ptr ds:[di] 61 mov es:[si],ax 62 add bx,2 63 add di,2 64 add si,16 65 loop s4 66 67 mov ah, 4ch 68 int 21h 69 70 code ends 71 end start
实验结果:
运行前:
运行后: