【汇编语言/底层开发】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


目录
相关文章
|
存储
汇编语言中“$”的作用
汇编语言中“$”的作用
814 0
汇编语言中“$”的作用
|
9月前
|
存储 安全 编译器
5.10 汇编语言:汇编过程与结构
过程的实现离不开堆栈的应用,堆栈是一种后进先出`(LIFO)`的数据结构,最后压入栈的值总是最先被弹出,而新数值在执行压栈时总是被压入到栈的最顶端,栈主要功能是暂时存放数据和地址,通常用来保护断点和现场。栈是由`CPU`管理的线性内存数组,它使用两个寄存器`(SS和ESP)`来保存栈的状态,SS寄存器存放段选择符,而ESP寄存器的值通常是指向特定位置的一个32位偏移值,我们很少需要直接操作ESP寄存器,相反的ESP寄存器总是由`CALL,RET,PUSH,POP`等这类指令间接性的修改。
44 0
|
9月前
|
传感器 安全 物联网
0x00 . BlueNRG-1堆栈架构编程 记录总结
0x00 . BlueNRG-1堆栈架构编程 记录总结
|
11月前
|
存储 缓存 算法
【操作系统--MMU内存管理单元】Linux环境下C语言详解(附代码)
【操作系统--MMU内存管理单元】Linux环境下C语言详解(附代码)
211 0
|
11月前
|
C语言
【C语言进阶】了解计算机的程序环境和预处理过程 掌握计算机预处理操作(下)
【C语言进阶】了解计算机的程序环境和预处理过程 掌握计算机预处理操作(下)
|
IDE Java 开发工具
Python语言应该加上块标识(开始、结束)的特性
Python语言应该加上块标识(开始、结束)的特性
78 0
(c语言)函数和一部分编程基础题
(c语言)函数和一部分编程基础题
(c语言)函数和一部分编程基础题
|
编译器
【CSAPP数据段解析】汇编语言机械级编程
【CSAPP数据段解析】汇编语言机械级编程
86 0
【CSAPP数据段解析】汇编语言机械级编程
|
人工智能 程序员 编译器
【C语言指针详解-CSAPP数据段解析】1024程序员节 | 汇编语言机械级编程|用代码,改变世界#
【C语言指针详解-CSAPP数据段解析】1024程序员节 | 汇编语言机械级编程|用代码,改变世界#
90 0
【C语言指针详解-CSAPP数据段解析】1024程序员节 | 汇编语言机械级编程|用代码,改变世界#
驱动开发:内核LDE64引擎计算汇编长度
本章开始`LyShark`将介绍如何在内核中实现`InlineHook`挂钩这门技术,内核挂钩的第一步需要实现一个动态计算汇编指令长度的功能,该功能可以使用`LDE64`这个反汇编引擎,该引擎小巧简单可以直接在驱动中使用,LDE引擎是`BeaEngine`引擎的一部分,后来让`BeatriX`打包成了一个`ShellCode`代码,并可以通过`typedef`动态指针的方式直接调用功能,本章内容作为后期`Hook`挂钩的铺垫部分,独立出来也是因为代码太多太占空间一篇文章写下来或很长影响阅读。
208 0
驱动开发:内核LDE64引擎计算汇编长度