实验3 多个段的汇编源程序编写与调试
四、实验结论
- 实验任务1
- 源代码文件task1.asm
assume cs:code, ds:data
data segment
db 'Nuist'
db 5 dup(2)
data ends
code segment
start:
mov ax, data
mov ds, ax
mov ax, 0b800H
mov es, ax
mov cx, 5!设置循环次数为5
mov si, 0
mov di, 0f00h !设置起始内存单元地址
s: mov al, [si] !将数据段内存单元[si]赋给al
and al, 0dfh !将字母转为大写字母
mov es:[di], al !将结果保存给附加段的内存单元中
mov al, [5+si] !将指针移动至保存数据的内存单元中
mov es:[di+1], al !将数据紧跟大写字母保存
inc si !si自增1
add di, 2 !di因为每次保存两字节数据(字母和数字2)所以自增2
loop s !继续下次循环
mov ah, 4ch
int 21h
code ends
end start
-
运行结果截图
![]()
-
在debug里调试到程序返回前的截图
![]()
-
分析源代码中data段line4的字节数据的用途
修改line4里5个字节单元的值——db 5 dup(2)改成db 2,3,4,5,6
db 2,3,4,5,6
结果如下:

猜测此处数据的作用是改变大写字母的颜色。
- 实验任务2
- 源代码文件task2.asm
assume cs:code, ds:data
data segment
db 23, 50, 66, 71, 35
data ends
code segment
start:
mov ax, data
mov ds, ax
mov di, 0
mov cx, 5
s: mov ah, 0
mov al, ds:[di]
mov bl, 10
div bl
mov ds:[10+di], al
mov ds:[11+di], ah
mov ah, 2
mov dl, ds:[10+di]
add dl, 30h
int 21h
mov ah, 2
mov dl, ds:[11+di]
add dl, 30h
int 21h
mov ah, 2
mov dl, " "
int 21h
inc di
loop s
mov ax, 4c00h
int 21h
code ends
end start
- 运行结果截图
![]()
- 实验任务3
- 源代码文件task3.asm
assume cs:code, ds:data, ss:stack
data segment
dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h
data ends
stack segment
dw 0, 0, 0, 0, 0, 0, 0, 0
stack ends
code segment
start: mov ax,stack
mov ss, ax
mov sp,16
mov ax, data
mov ds, ax
push ds:[0]
push ds:[2]
pop ds:[2]
pop ds:[0]
mov ax,4c00h
int 21h
code ends
end start
- 回答教材中①②③三个问题。
①cpu执行程序返回前,data段中的数据为多少:
![]()
②cpu执行程序返回前,cs=076CH、ss=076BH、ds=076AH
![]()
③程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1
- 实验任务4
- 源代码文件task4.asm
assume cs:code, ds:data, ss:stack
data segment
dw 0123h, 0456h
data ends
stack segment
dw 0, 0
stack ends
code segment
start: mov ax,stack
mov ss, ax
mov sp,16
mov ax, data
mov ds, ax
push ds:[0]
push ds:[2]
pop ds:[2]
pop ds:[0]
mov ax,4c00h
int 21h
code ends
end start
- 回答教材中①②③④四个问题。
①CPU执行程序,程序返回前,data段中的数据为多少
![]()
②CPU执行程序,程序返回前,cs=076CH、ss=076BH、ds=076AH
![]()
③data段的段地址为X-2,stack段的段地址为X-1
④对于如下定义的段
name segment
...
name ends
如果段中的数据占N个字节,那么程序加载后,该段实际占有空间为:((N+15)/16)*16
- 实验任务5
- 源代码文件task5.asm
assume cs:code, ds:data, ss:stack
code segment
start: mov ax,stack
mov ss, ax
mov sp,16
mov ax, data
mov ds, ax
push ds:[0]
push ds:[2]
pop ds:[2]
pop ds:[0]
mov ax,4c00h
int 21h
code ends
data segment
dw 0123h, 0456h
data ends
stack segment
dw 0,0
stack ends
end start
- 回答教材中①②③三个问题。
①CPU执行程序,程序返回前,data段中的数据为多少
![]()
②CPU执行程序,程序返回前,cs=076AH、ss=076EH、ds=076DH
![]()
③data段的段地址为X+3,stack段的段地址为X+4
- 实验任务6
- 如果将(1)、(2)、(3)题中最后一条伪指令“end start”改为“end”(也就是说,不指明程序的入口),则哪个程序仍然可以正确执行?请说明原因。
答:task5仍可以正确执行。CPU无法自动识别哪些是指令哪些是数据。如果不指明入口位置,则程序会按顺序从所分配的空间开始执行。由于task5是汇编指令段开头,按顺序能够正确执行。
- 实验任务7
- 完整源代码文件task7.asm
assume cs:code
a segment
db 1,2,3,4,5,6,7,8
a ends
b segment
db 1,2,3,4,5,6,7,8
b ends
c segment ; 在集成软件环境中,请将此处的段名称由c→改为c1或其它名称
db 8 dup(0)
c ends
code segment
start:
mov ax,a
mov ds,ax
mov cx,8
mov ax,b
mov es,ax
mov di,0
s: mov al,ds:[di]
add es:[di],al
inc di
loop s
mov ax,c
mov ds,ax
mov cx,8
mov di,0
s1: mov al,es:[di]
add [di],al
inc di
loop s1
mov ax,4c00h
int 21h
code ends
end start
- 在debug环境中,执行到程序返回前,查看逻辑段c的数据的截图,以此验证所编写的程序正确实现了题目要求。
![]()
- 实验任务8
- 完整源代码文件task8.asm
assume cs:code
a segment
dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh
a ends
b segment
dw 8 dup(0)
b ends
code segment
start:
mov ax,b
mov ss,ax
mov ax,a
mov ds,ax
mov sp,0010h
mov di,0
mov cx,8
s: push [di]
add di,2
loop s
mov ax,4c00h
int 21h
code ends
end start
- 在debug环境中,执行到程序返回前,查看逻辑段c的数据的截图,以此验证所编写的程序正确实现了题目要求。
![]()












浙公网安备 33010602011771号