第六章 包含多个段的程序
# 第六章 包含多个段的程序
程序取得所需空间的方法有两种,一是在加载程序的时候为程序分配,再就是程序在执行的过程向系统分配。在本课程中,我们只讨论第一种方法。
# 6.1 在代码段中使用数据
下面一段代码用于计算 8 个数据的累加和,结果放在 ax 寄存器中:
assume cs:code
code segment
dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h
start mov bx, 0
mov ax, 0
mov cx, 8
s: add ax, cs:[bx]
add bx, 2
loop s
mov ax, 4c00H
int 21H
code ends
end start
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
分析这段代码,我们使用 dw 定义了 8 个字型数据,并且使用 “end 标号” 的形式指明了程序的入口。
# 6.2 在代码段中使用栈
assume cs:codesg
codesg segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
start: mov ax, cs
mov ss, ax
mov sp, 30h
mov bx, 0
mov cx, 8
s: push cs:[bx]
add bx, 2
loop s
mov bx, 0
mov cx, 8
s0: pop cs:[bx]
add bx, 2
loop s0
mov ax, 4c00h
int 21h
codesg ends
end start
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 6.3 将数据、代码、栈放入不同的段
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,0,0,0,0,0,0,0,0
stack ends
code segment
start: mov ax, stack
mov ss, ax
mov sp, 20h
mov ax, data
mov ds, ax
mov bx, 0
mov cx, 8
s: push [bx]
add bx, 2
loop s
mov bx, 0
mov cx, 8
s0: pop [bx]
add bx, 2
loop s0
mov ax, 4c00h
int 21h
code ends
end start
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
下面对以上代码进行说明。
(1)定义多个段的方法
定义数据段、栈段与定义代码段的方法没有区别,只是对于不同的段,要有不同的段名。
(2)对段地址的引用
在程序中,段名就相当于一个标号,它代表了段地址。例如程序中 “data” 段中的数据 “0abch” 的地址就是:data:6。要将它送入 bx 中,代码如下:
mov ax, data
mov ds, ax
mov bx, ds:[6]
1
2
3
2
3
1
2
3
2
3
(3)“代码段”、“数据段”、“栈段” 完全是我们的安排
我们通过 “end 标号” 的形式来声明程序的入口地址,这个入口信息被写入可执行文件中的描述信息中。可执行文件中的程序被加载入内存后,CPU 的 CS:IP 就会被设置指向这个入口。
我们通过如下代码来指定程序的栈段:
mov ax, stack
mov ss, ax
mov sp, 20h
1
2
3
2
3
1
2
3
2
3
通过如下代码来指定数据段:
mov ax, data
mov ds, ax
1
2
2
1
2
2
总而言之,CPU 到底如何处理我们定义的段中的内容,是当作指令执行,当作数据访问,还是当作栈空间,完全靠程序中具体的汇编指令,和汇编指令对 CS:IP、SS:SP、DS 等寄存器的设置来决定的。
上次更新: 2023/01/06, 19:28:46