实验3 多个段的汇编源程序编写与调试
1. 实验任务1
使用任意文本编辑器,录入汇编源程序task1.asm。

阅读源程序,从理论上分析源代码的功能,尤其是line15-25,循环实现的功能是什么,逐行理解每条指 令的功能。
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//将数据2紧跟大写字母保存 inc si//si自增1 add di, 2//di因为每次保存两字节数据(字母和数字2)所以自增2 loop s//继续下次循环
使用masm、link对task1.asm进行汇编、链接,得到可执行文件task1.exe,运行并观察结果。

使用debug工具对程序进行调试,执行到程序返回前,即line27之前,观察结果。


修改line4里5个字节单元的值,重新汇编、链接、运行,观察结果。


基于观察,分析、猜测这里的数值作用是什么。
根据实验结果观察猜测此处数据的作用是改变大写字母的颜色。
2. 实验任务2
已知数据段data中定义字节数据如下:

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
s1: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 s1
mov ax,4c00h
int 21h
code ends
end start

3. 实验任务3
教材「实验5 编写、调试具有多个段的程序」(1) 程序源码见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段中的数据为多少?
076AH
CPU执行程序,程序返回前,cs=076CH,ss=076BH,ds= 076AH。
设程序加载后,code段的段地址为X,则data段的段地址为 X-2,stack段的段地址为X-1 。
4. 实验任务4
教材「实验5 编写、调试具有多个段的程序」(2) 程序源码见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段中的数据为多少?
076AH
CPU执行程序,程序返回前,cs=076CH、ss=076BH、ds=076AH。
设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1。
对于如下定义段:
name segment
name ends
如果段中的数据占N个字节,则该程序加载后,该段实际占有的空间为16字节。
5. 实验任务5
教材「实验5 编写、调试具有多个段的程序」(3) 程序源码见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段中的数据为多少?
076DH
CPU执行程序,程序返回前,cs=076AH、ss=076EH、ds=076DH。
设程序加载后,code段的段地址为X,则data段的段地址为X+3,stack段的段地址为X+4。
6. 实验任务6
教材「实验5 编写、调试具有多个段的程序」(4)
(3)题的程序仍可以正确执行,因为(3)是先为代码段分配内存,所以ip指针默认指向代码段的起始地址。
7. 实验任务7
教材「实验5 编写、调试具有多个段的程序」(5) 程序源码见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
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

8. 实验任务8
教材「实验5 编写、调试具有多个段的程序」(6) 程序源码见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


浙公网安备 33010602011771号