汇编语言学习笔记(六):包含多个段的程序

学习参考:汇编语言(第2版)王爽

  • 在代码段中使用数据
  • 在代码段中使用栈
  • 将数据、代码、栈放入不同的段

在代码段中使用数据

1
2
3
4
5
6
7
8
9
10
11
12
assume cs:code

code segment

数据

start:

代码

code ends
end start

这里 end 的作用除了通知编译器程序结束外,还可以通知编译器程序的入口在什么地方。比如在程序中指明了程序的入口在标号 start 处,也就是说,会从 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
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
; 用 dw 定义 16 个字形数据,在程序加载后,将取得 16 个字的
; 内存空间,存放这 16 个数据。在后面的程序中将这段
; 空间当作栈来使用
start: mov ax,cs
mov ss,ax
mov sp,30h ; 将设置栈顶 ss:sp 指向 cs:30

mov bx,0
mov cx,8
s: push sc:[bx]
add bx,2
loop s ; 将以上代码段 0~15 单元中的 8 个字型数据依次入栈

mov bx,0
mov cx,8
s0: pop cs:[bx]
add bx,2
loop s0 ; 以上依次出栈 8 个字型数据到代码段 0~15 单元中

mov ax,4c00h
int 21h

codesg ends
end start ; 指明程序入口在 start 处
我们要将 cs:10~cs:2F (10是因为前面定义了 8 个字(2*8=10h),2F是因为 10+16*2=2Fh)的内存空间当作栈来用,初始状态下为空,所以 ss:sp 要指向栈底,则设置 ss:sp 指向 cs:30

将数据、代码、栈放入不同的段

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
assume cs:code,ds:data,ss:stack

data segment

;数据

data ends

stack segment

;数据

stack ends

code segment

start:
mov ax, stack
mov ss,ax
mov sp,20h ; 设置栈顶 ss:sp 指向 stack:20 这里只是距离

mov ax,data
mov ds,ax ; ds 指向 data 段

; 其他代码

code ends
end start
Author: Inno Fang
Link: http://innofang.github.io/2017/11/23/%E6%B1%87%E7%BC%96%E8%AF%AD%E8%A8%80%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%EF%BC%88%E5%85%AD%EF%BC%89%EF%BC%9A%E5%8C%85%E5%90%AB%E5%A4%9A%E4%B8%AA%E6%AE%B5%E7%9A%84%E7%A8%8B%E5%BA%8F/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-ND 4.0 unless stating additionally.