【汇编语言/底层开发】6、程序中包含多个segment

简介: 众所周知的是,我们所开发的应用程序需依赖于操作系统运行,因此应用程序所使用的内存空间必须是安全的,不能与操作系统和其他应用程序相重合。因此,应用程序所需要的空间应当通过操作系统申请。

众所周知的是,我们所开发的应用程序需依赖于操作系统运行,因此应用程序所使用的内存空间必须是安全的,不能与操作系统和其他应用程序相重合。因此,应用程序所需要的空间应当通过操作系统申请。对于我们使用汇编语言开发的程序而言,可以通过在源程序中定义段来获取内存空间。

1、在代码段中定义数据

在编写汇编程序时,可以直接在代码段中对数据进行定义。使用dw可以定义若干个字型数据,每个数据占据两个字节。但是由此带来的问题就是,代码段中的所有数据在运行时都会当做指令代码进行处理,因此我们使用dw定义的数据不会被正确识别。为了解决这个问题,我们可以在程序真正的起始位置前和伪指令end后面加上起始标号start:,通过这种方式通知编译器程序正确的起始位置。这样程序的框架就像下面这个样子。

assume cs:code
code segment
	//数据
	//......
	//......
start:
	//代码
	//......
	//......
code ends
end start

下面就是一个采用这种框架的程序:

assume cs:code
code segment
	dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
start:
	mov bx,0 
	mov ax,0
	mov cs,8
s:	add ax, cs:[bx]
	add bx, 2
	loop s
	
	mov ax, 4c00h
	int 21h
code ends
end start

2、使用多个段进行数据、代码和栈的分离

如前一节所叙述的使用起始标号来分隔代码和数据的方法存在一些问题。主要由:(1)使得程序显得混乱、可读性差;(2)如果数据、栈和代码占用了超过64k的空间,那么将无法放入一个段中。为了解决这个问题,我们可以定义多个段,分别来保存数据、栈元素和代码。

代码段、数据段和栈段寄存器可以分别在伪指令assume中定义相应的别名,通过这些别名定义代码段、数据段和栈段。具体的实现过程可参考以下程序段:

//assume是只在源程序中存在的伪指令,由编译器执行,并不会自动绑定寄存器和segment名称,因此还是要手动对各个寄存器赋值
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


目录
相关文章
加快软盘操作速度的汇编程序源代码
加快软盘操作速度的汇编程序源代码
|
7月前
51单片机用汇编语言实现独立按键检测,每个按键有不同功能,包含按键消抖程序
51单片机用汇编语言实现独立按键检测,每个按键有不同功能,包含按键消抖程序
186 3
|
7月前
|
程序员 编译器 数据处理
汇编高手秘籍:解锁性能优化新境界,用汇编语言让你的程序飞起来!
【8月更文挑战第31天】汇编语言作为编程基石,其高效性能备受推崇。尽管现代软件开发更偏爱高级语言,但在性能要求极高的场景下,汇编优化仍不可或缺。本文通过示例代码介绍四种优化技巧:循环展开、寄存器分配、指令重排及SIMD指令使用,显著提升执行效率。同时强调分析性能瓶颈、测试优化效果及保持代码可读性的重要性,助力开发者在关键代码路径上实现性能突破。
273 0
8086 汇编笔记(五):包含多个段的程序
8086 汇编笔记(五):包含多个段的程序
|
10月前
|
编译器 开发者 C++
8086 汇编笔记(三):第一个程序
8086 汇编笔记(三):第一个程序
|
9月前
|
C语言
程序技术好文:部分ARM汇编指令解读
程序技术好文:部分ARM汇编指令解读
|
10月前
|
存储 编译器
C51汇编程序
C51汇编程序
94 5
|
存储 Java C++
汇编语言、寄存器分类及程序计数器
汇编语言、寄存器分类及程序计数器
172 0
|
程序员 芯片 流计算
MOTOROLA MVME 162-01 直接用汇编语言编程的计算机程序
MOTOROLA MVME 162-01 直接用汇编语言编程的计算机程序
152 0
MOTOROLA MVME 162-01 直接用汇编语言编程的计算机程序
进阶C语言 第七章-------《程序的编译(预处理操作)+链接》 (预编译、编译、汇编、#define、条件编译,#include的包含)知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏(三)
进阶C语言 第七章-------《程序的编译(预处理操作)+链接》 (预编译、编译、汇编、#define、条件编译,#include的包含)知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏(三)