实验二 多个逻辑段的汇编源程序编写与调试
四、实验结论
1. 实验任务1
任务1-1
task1_1.asm源码

task1_1调试到line17结束、line19之前截图
问题回答
① 在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = _076A___, 寄存器(SS)
= _076B___, 寄存器(CS) = _076C___
② 假设程序加载后,code段的段地址是X,则,data段的段地址是_X-2h___, stack的段地址是
_X-1h___。
任务1-2
任务task1_2.asm源码

task1_2调试到line17结束、line19之前观察寄存器DS, CS, SS值的截图

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


task1_3调试到line17结束、line19之前观察寄存器DS, CS, SS值的截图

问题回答
① 在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = _076A___, 寄存器(SS)
= _076C___, 寄存器(CS) = _076E___
② 假设程序加载后,code段的段地址是X,则,data段的段地址是_X-4h___, stack的段地址是
_X-2h___。
任务1-4
任务task1_4.asm源码

task1_4调试到line17结束、line19之前观察寄存器DS, CS, SS值的截图

问题回答
① 在debug中将执行到line9结束、line11之前,记录此时:寄存器(DS) = _076C___, 寄存器(SS) =
_076E___, 寄存器(CS) = _076A___
② 假设程序加载后,code段的段地址是X,则,data段的段地址是_X+2h___, stack的段地址
是__X+4h__。
任务1-5
基于上述四个实验任务的实践、观察,总结并回答:

① 对于如下定义的段,程序加载后,实际分配给该段的内存空间大小是 _(向上取整)[N/16]*16 byte__。
② 如果将程序task1_1.asm, task1_2.asm, task1_3.asm, task1_4.asm中,伪指令 end start 改成
end , 哪一个程序仍然可以正确执行。结合实践观察得到的结论,分析、说明原因。
task1_4.asm可以正常运行,end start 指明程序的入口地址在标号start处,如果不指明程序的入口地址则默认
从程序的首部开始执行,而只有task1_4.asm的首部是程序段,1,2,3的首部不是程序段,所以不能正常运行。
2. 实验任务2
汇编源代码
1 assume cs:code 2 3 code segment 4 5 mov ax, 0b800h 6 mov ds, ax 7 mov bx, 0f00h 8 mov cx, 80 ;循环80次 9 10 mov ax,0403h 11 s: mov [bx],ax ;将0403h放入内存 12 add bx, 2 13 loop s 14 15 mov ax,4c00h 16 int 21h 17 code ends 18 end
运行结果截图

3. 实验任务3
补充完整后的汇编源代码
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, 10 s: mov ax,[bx] mov [bx+32],ax ;将data1中第一个数据放在data3中 mov ax,[bx+16] add [bx+32],ax ;将data1与data2 数据相加放入data3中 inc bx loop s mov ah, 4ch int 21h code ends end start
在debug中加载、反汇编、调试截图
要求给出,在数据项依次相加之前,查看逻辑段data1, data2, data3对应的内存空间数据原始值的 debug命令和截图
以及,依次相加之后,查看逻辑段data1, data2, data3对应的内存空间数据原始值的debug命令和 截图
反汇编截图:

相加前:

相加后:

4. 实验任务4
补充完整后的汇编源代码
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 mov si, 000eh ;[si]指向data1段最后一个字单元 mov di, 0 ;[16+di]指向data2段第一个字单元 mov cx, 8 s: mov word ptr ax, [si] mov word ptr [16+di], ax sub si, 2 add di, 2 loop s mov ah, 4ch int 21h code ends end start
在debug中加载、反汇编、调试截图 要求给出,在程序退出前,使用d命令查看数据段data2对应的内存空间的截图。
反汇编截图:

运行结果:
运行前 data1 和 data2 截图:

运行后 data1 和 data2 截图:

5. 实验任务5
task5.asm源码


运行结果截图
l
使用debug工具对程序进行调试,使用g命令一次性执行到程序返回前(即line25执行之后、line27 执行之前)的截图

源代码中line19的作用是?
利用大写字母和小写字母ASCLL码的规则,通过 and 1101 1111 运算将小写字母转换为大写字母。
源代码中data段line4的字节数据的用途是?
改变字体的颜色。
line4 改为: db 5 dup(2) :

line4 改为: db 5 dup(9):

6. 实验任务6
task6.asm源代码
assume cs:code, ds:data data segment db 'Pink Floyd ' ; 16字节 db 'JOAN Baez ' ; 16字节 db 'NEIL Young ' ; 16字节 db 'Joan Lennon ' ; 16字节 data ends code segment start: mov ax, data mov ds, ax mov bx, 0 mov cx, 4 ;外层循环 4行 s: mov dx, cx ;将外层循环的cx存起来 mov si, 0 mov cx, 4 ;内层循环 取出每句的前四个字母 s0: mov al, [bx+si] or al, 20h mov [bx+si], al inc si loop s0 add bx, 16 ;第一句加16移到下一个句句首 mov cx, dx loop s mov ah, 4ch int 21h code ends end start
在debug中加载、反汇编、调试截图
反汇编截图:

要求给出,在程序退出前,使用d命令查看数据段data对应的内存空间的截图。
初始内存空间截图:

运行结果截图:

7. 实验任务7
task7.asm源码
assume cs:code, ds:data, es:table data segment db '1975', '1976', '1977', '1978', '1979' dd 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 di,0 ;data中指针 ; 保存年份 mov cx,5 ;外层循环 mov si,0 ;table行号 year: mov dx,cx ;保存外层循环cx mov cx,4 ;内层循环 mov bx,0 ;table列号 year1: mov al,ds:[di] mov es:[si+bx],al inc bx inc di loop year1 mov cx,dx add si,16 loop year ; 保存收入 mov cx,5 mov bx,5 ;从table 第五列开始存 mov si,0 ;将table 行号置0 income: mov word ptr ax,ds:[di] mov word ptr es:[si+bx],ax ;收入低16位 add di,2 mov word ptr ax,ds:[di] mov word ptr es:[si+bx+2],ax ;收入高16位 add di,2 add si,16 loop income ; 保存雇员数 mov cx,5 mov bx,10 ;从table 第10列开始存 mov si,0 ;将table 行号置0 num: mov word ptr ax,ds:[di] mov word ptr es:[si+bx],ax add di,2 add si,16 loop num ;计算人均收入并保存 mov cx,5 mov bx,5 ;定位table 第5列收入 mov si,0 ;将table 行号置0 ave: mov word ptr ax,es:[si+bx] ;被除数 32 位 低 16 位 mov word ptr dx,es:[si+bx+2] ;被除数 高16位 div word ptr es:[si+bx+5] mov es:[si+bx+8],ax add si,16 loop ave mov ah, 4ch int 21h code ends end start
调试截图
查看table段原始数据信息截图

在debug中运行到程序退出之前,使用d命令查看table段对应的内存空间的截图,确认信息是 否按要求结构化地写入到指定内存


浙公网安备 33010602011771号