实验3 多个段的汇编源程序编写与调试
实验3 多个段的汇编源程序编写与调试
1. 实验任务1
此部分书写内容:
- 附上源代码文件task1.asm
- 附上运行结果截图
- 使用debug工具对程序进行调试,执行到程序返回前,即line27之前,观察结果
- 分析源代码中data段line4的字节数据的用途
结论
task1.asm源代码:
1 assume cs:code, ds:data 2 data segment 3 db 'Nuist' 4 db 5 dup(2) 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
使用masm、link工具汇编、链接的命令行及运行结果截图:

使用debug调试:

修改line4里5个字节单元的值,重新汇编、链接、运行,观察结果:
1 db 5 dup(2) 2 --> 改成: 3 db 2,3,4,5,6

分析:
- 循环体实现了字符与颜色的绑定并循环输出至显存区。
- 修改之后输出字符颜色发生了变化,内容保持不变。分析可知, db 5 dup(2) 表示分配5字节内存空间并初始化为2; db 2,3,4,5,6 表示直接分配5字节内存空间并初始化为2,3,4,5,6.综上分析可知,修改的部分控制了输出字符的颜色,对内容并五影响。
2. 实验任务2
此部分书写内容:
- 附上源代码文件task2.asm
- 附上运行结果截图
结论
task2.asm源代码:
1 assume cs:code,ds:data 2 data segment 3 db 23,50,66,71,35 4 data ends 5 code segment 6 start: 7 mov ax,data 8 mov ds,ax 9 mov di,0 10 mov cx,5 11 12 s1: mov ah,0 13 mov al,ds:[di] 14 mov bl,10 15 div bl 16 mov ds:[10+di],al 17 mov ds:[11+di],ah 18 19 mov ah,2 20 mov dl,ds:[10+di] 21 add dl,30h 22 int 21h 23 24 mov ah,2 25 mov dl,ds:[11+di] 26 add dl,30h 27 int 21h 28 29 mov ah,2 30 mov dl," " 31 int 21h 32 33 inc di 34 loop s1 35 36 mov ax,4c00h 37 int 21h 38 code ends 39 end start
运行结果截图:

3. 实验任务3
此部分书写内容:
- 附上源代码文件task3.asm
- 回答教材中①②③三个问题
- 基于以下实验操作的发现和文字说明
- 附上回答①时,反汇编查看data段中数据的截图。验证观察到的结果和理论分析是否一致
- 附上回答②时反汇编调试截图,即:在debug中,执行到程序返回前的调试截图
结论
task3程序源码:
1 assume cs:code, ds:data, ss:stack 2 data segment 3 dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h 4 data ends 5 6 stack segment 7 dw 0, 0, 0, 0, 0, 0, 0, 0 8 stack ends 9 10 code segment 11 start: mov ax,stack 12 mov ss, ax 13 mov sp,16 14 15 mov ax, data 16 mov ds, ax 17 18 push ds:[0] 19 push ds:[2] 20 pop ds:[2] 21 pop ds:[0] 22 23 mov ax,4c00h 24 int 21h 25 26 code ends 27 end start
-
CPU执行程序,程序返回前,data段中数据为多少?
data段数据为:0123h,0456h,0789h,0abch,0defh,0fdeh,0cbah,0987h
-
CPU执行程序,程序返回前,cs=076c、ss=076b、ds=076a
-
设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1
反汇编调试验证:
debug结果符合预期。
4. 实验任务4
此部分书写内容:
- 附上源代码文件task4.asm
- 回答教材中①②③④四个问题
- 附上回答②时反汇编调试截图,即:在debug中,执行到程序返回前的调试截图
结论
task4.asm程序源代码:
1 assume cs:code, ds:data, ss:stack 2 data segment 3 dw 0123h, 0456h 4 data ends 5 6 stack segment 7 dw 0, 0 8 stack ends 9 10 code segment 11 start: mov ax,stack 12 mov ss, ax 13 mov sp,16 14 15 mov ax, data 16 mov ds, ax 17 18 push ds:[0] 19 push ds:[2] 20 pop ds:[2] 21 pop ds:[0] 22 23 mov ax,4c00h 24 int 21h 25 26 code ends 27 end start
- CPU执行程序,程序返回前,data段中数据为多少? data段数据为0123h,0456h
- CPU执行程序,程序返回前,cs=076c、ss=076b、ds=076a
- 设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1
- 对于如下定义段:
如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为(N/16+1)*16(因为计算机占据空间必须为16的倍数)
name segment ... name ends
反汇编调试验证:

debug结果符合预期。
5. 实验任务5
此部分书写内容:
- 附上源代码文件task5.asm
- 回答教材中①②③三个问题
- 附上回答②时反汇编调试截图,即:在debug中,执行到程序返回前的调试截图
结论
task5.asm程序源代码:
1 assume cs:code, ds:data, ss:stack 2 3 code segment 4 start: mov ax,stack 5 mov ss, ax 6 mov sp,16 7 8 mov ax, data 9 mov ds, ax 10 11 push ds:[0] 12 push ds:[2] 13 pop ds:[2] 14 pop ds:[0] 15 16 mov ax,4c00h 17 int 21h 18 19 code ends 20 data segment 21 dw 0123h, 0456h 22 data ends 23 24 stack segment 25 dw 0,0 26 stack ends 27 end start
- CPU执行程序,程序返回前,data段中数据为多少? data段数据为0123h,0456h
- CPU执行程序,程序返回前,cs=076a、ss=076e、ds=076d
- 设程序加载后,code段的段地址为X,则data段的段地址为X+3,stack段的段地址为X+4
反汇编调试验证:

debug结果符合预期。
6. 实验任务6
此部分书写内容:
- 回答教材中提出的问题,并按要求说明原因。
结论
如果将任务三到任务五的“end start”改为“end”,则哪个程序可以正常执行?说出原因?
答:只有任务五的汇编程序可以正常执行。因为任务五程序的代码段定义于数据段和栈段之前,在顺序执行的过程中会首先执行代码段,而不会因执行了数据段和栈段导致程序出现不符合预期的情况。
7. 实验任务7
此部分书写内容:
- 附上完整源代码文件task7.asm
- 附上在debug环境中,执行到程序返回前,查看逻辑段c的数据的截图,以此验证所编写的程序正确实现了题目要求
结论
task7.asm程序源代码:
1 assume cs:code 2 a segment 3 db 1,2,3,4,5,6,7,8 4 a ends 5 b segment 6 db 1,2,3,4,5,6,7,8 7 b ends 8 c1 segment 9 db 0,0,0,0,0,0,0,0 10 c1 ends 11 code segment 12 start: 13 mov ax,a 14 mov ds,ax 15 16 mov ax,b 17 mov es,ax 18 19 mov bx,0 20 mov cx,8 21 22 s: 23 mov dl,[bx] 24 add dl,es:[bx] 25 push ds 26 mov ax,c1 27 mov ds,ax 28 mov [bx],dl 29 pop ds 30 inc bx 31 loop s 32 33 mov ax,4c00h 34 int 21h 35 36 code ends 37 end start
反汇编调试验证:

debug结果符合预期。
8. 实验任务8
此部分书写内容:
- 附上完整源代码文件task8.asm
- 附上在debug环境中,执行到程序返回前,查看逻辑段c的数据的截图,以此验证所编写的程序正 确实现了题目要求。
结论
1 assume cs:code 2 a segment 3 dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh 4 a ends 5 6 b segment 7 dw 8 0,0,0,0,0,0,0,0 8 b ends 9 10 code segment 11 start: 12 mov ax,a 13 mov ds,ax 14 15 mov ax,b 16 mov ss,ax 17 mov sp,16 18 mov si,0 19 20 mov cx,8 21 22 s: push ds:[si] 23 add si,2 24 loop s 25 mov ax,4c00h 26 int 21h 27 28 code ends 29 end start
反汇编调试验证:

debug结果符合预期。

浙公网安备 33010602011771号