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

学习参考:汇编语言(第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
文章作者: Inno Fang
文章链接: https://innofang.github.io/2017/11/23/汇编语言学习笔记(六):包含多个段的程序/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明来自 Inno's Blog