一、实验目的
1. 理解和掌握将数据、代码、栈放入不同段的程序的编写和调试
2. 理解具有多个段的汇编源程序对应的目标程序执行时,内存分配方式
二、实验准备
1. 结合第 6 章教材和课件,复习第 6 章内容
2. 复习第 3 章「栈」的知识
三、实验内容
教材 133 实验 5
任务一:将下面的程序编译、连接,用Debug加载、跟踪,然后回答问题
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
先在debug下进行编译,连接
在debug环境下进行加载
任务一结果为:
1. CPU执行程序,程序返回前,data段中的数据为:0123H, 0456H, 0789H, 0ABCH, 0DEFH, 0FEDH, 0CBAH, 0987H;
2. CPU执行程序,程序返回前,cs=076C ,ss=076B ,ds=076A;
3. 程序加载后,code段的段地址为X,则data段的段地址为: X-2 ,stack段的段地址为: X-1;
任务二:将下面的程序编译、连接,用debug加载、跟踪,然后回答问题。
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
操作步骤与任务一相似
任务二结果为:
1. CPU执行程序,程序返回前,data段中的数据为:0123h, 0456h;
2. CPU执行程序,程序返回前,cs=076C ,ss=076B ,ds=076A ;
3. 设程序加载后,code段的段地址为X ,则data段的段地址为:X-2 ,stack段的段地址为:X-1;
4. 对于如下定义的段:
name segment
name ends
如果段中的数据占N个字节则程序加载后,该段实际占有的空间为: (N/16+1)*16;
任务三:将下面的程序编译、连接,用debug加载、跟踪,然后回答问题。
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
任务三结果:
1. CPU执行程序,程序返回前,data段中的数据为:0123h, 0456h
2. CPU执行程序,程序返回前,cs=076A ,ss=076E ,ds=076D
3. 程序加载后,code段的段地址为X,则data段的段地址为:X+3 ,stack段的段地址为:X+4
任务四:将以上三题中最后一条伪指令“end start"改为”end"(也就是说,不指明程序的入口),则哪个程序仍然可以正确执行?请说明原因。
任务一二的代码在反汇编之后出现了变化
任务三的代码没变
任务五:程序如下,编写code段中的代码,将a段和b段中的数据依次相加,将结果存到c段中。
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 bx,0
mov cx,8
mov ax,a
mov ds,ax
mov ax,c
mov es,ax
s: mov dx,0
mov ax,a
mov ds,ax
add dl, [bx]
mov ax,b
mov ds,ax
add dl,[bx]
mov es:[bx],dl
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end start
任务五结果为:02 04 06 08 0A 0C 0E 10
任务六:编写code段中的代码,用push命令将a段中的前8个字型数据,逆序存储到b段中
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 sp,10h
mov ax,a
mov ds,ax
mov cx,8
mov bx,0
s: push [bx]
add bx,2
loop s
mov ax,4c00h
int ax,21h
code ends
end start
实验总结:
(一)一定要熟练掌握loop pop push dw 等一系列操作指令的用途和作用
(二)对实验五和实验六的理解还不是很到位,代码参考了同学的,希望有同学能在下面留言告知逆序执行的思路