Pil0tXia 的书房 Pil0tXia 的书房
首页
  • 第一章 操作系统引论
  • 第二章 进程的描述与控制
  • 第三章 处理机调度与死锁
  • 第四章 存储器管理
  • 第五章 虚拟存储器
  • 期末考试备考
汇编语言课程笔记
GitHub (opens new window)
首页
  • 第一章 操作系统引论
  • 第二章 进程的描述与控制
  • 第三章 处理机调度与死锁
  • 第四章 存储器管理
  • 第五章 虚拟存储器
  • 期末考试备考
汇编语言课程笔记
GitHub (opens new window)
  • 汇编语言课程笔记

    • 课堂速记
  • 《汇编语言》第三版阅读笔记

    • 第一章 基础知识
    • 第二章 寄存器
    • 第三章 寄存器(内存访问)
    • 第四章 第一个程序
    • 第五章 [BX]和loop指令
    • 第六章 包含多个段的程序
      • 6.1 在代码段中使用数据
      • 6.2 在代码段中使用栈
      • 6.3 将数据、代码、栈放入不同的段
    • 第七章 更灵活的定位内存地址的方法
    • 第八章 数据处理的两个基本问题
    • 第九章 转移指令的原理
    • 第十章 CALL和RET指令
    • 第十一章 标志寄存器
    • 第十二章 内中断
  • 汇编语言
  • 《汇编语言》第三版阅读笔记
Pil0tXia
2023-01-05
目录

第六章 包含多个段的程序

# 第六章 包含多个段的程序

程序取得所需空间的方法有两种,一是在加载程序的时候为程序分配,再就是程序在执行的过程向系统分配。在本课程中,我们只讨论第一种方法。

# 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
1
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
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

# 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
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

下面对以上代码进行说明。

(1)定义多个段的方法

定义数据段、栈段与定义代码段的方法没有区别,只是对于不同的段,要有不同的段名。

(2)对段地址的引用

在程序中,段名就相当于一个标号,它代表了段地址。例如程序中 “data” 段中的数据 “0abch” 的地址就是:data:6。要将它送入 bx 中,代码如下:

mov ax, data
mov ds, ax
mov bx, ds:[6]
1
2
3
1
2
3

(3)“代码段”、“数据段”、“栈段” 完全是我们的安排

我们通过 “end 标号” 的形式来声明程序的入口地址,这个入口信息被写入可执行文件中的描述信息中。可执行文件中的程序被加载入内存后,CPU 的 CS:IP 就会被设置指向这个入口。

我们通过如下代码来指定程序的栈段:

mov ax, stack
mov ss, ax
mov sp, 20h
1
2
3
1
2
3

通过如下代码来指定数据段:

mov ax, data
mov ds, ax
1
2
1
2

总而言之,CPU 到底如何处理我们定义的段中的内容,是当作指令执行,当作数据访问,还是当作栈空间,完全靠程序中具体的汇编指令,和汇编指令对 CS:IP、SS:SP、DS 等寄存器的设置来决定的。


上次更新: 2023/01/06, 19:28:46

← 第五章 [BX]和loop指令 第七章 更灵活的定位内存地址的方法→

Copyright © 2022-2023 Pil0tXia | CC BY-NC-SA 4.0 Licensed | 苏ICP备2023001491号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式