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


目录
相关文章
|
存储
汇编语言中“$”的作用
汇编语言中“$”的作用
740 0
汇编语言中“$”的作用
|
2月前
|
编译器 C语言
C程序结构
C程序结构。
16 1
|
8月前
|
存储 安全 编译器
5.10 汇编语言:汇编过程与结构
过程的实现离不开堆栈的应用,堆栈是一种后进先出`(LIFO)`的数据结构,最后压入栈的值总是最先被弹出,而新数值在执行压栈时总是被压入到栈的最顶端,栈主要功能是暂时存放数据和地址,通常用来保护断点和现场。栈是由`CPU`管理的线性内存数组,它使用两个寄存器`(SS和ESP)`来保存栈的状态,SS寄存器存放段选择符,而ESP寄存器的值通常是指向特定位置的一个32位偏移值,我们很少需要直接操作ESP寄存器,相反的ESP寄存器总是由`CALL,RET,PUSH,POP`等这类指令间接性的修改。
41 0
|
8月前
|
存储 算法 Java
编写第一个RISC-V程序
编写第一个RISC-V程序
84 0
程序三大结构-系统学习一
编程从三大结构考虑问题,这样的思考方式、学习方式也有了更加深刻的认识与理解
|
10月前
|
存储 资源调度 算法
【操作系统--页面置换算法】C语言详解--大作业版(附代码)
该实验为作者OS课程大作业,内容若有问题,望指出,多多交流
243 0
驱动开发:内核LDE64引擎计算汇编长度
本章开始`LyShark`将介绍如何在内核中实现`InlineHook`挂钩这门技术,内核挂钩的第一步需要实现一个动态计算汇编指令长度的功能,该功能可以使用`LDE64`这个反汇编引擎,该引擎小巧简单可以直接在驱动中使用,LDE引擎是`BeaEngine`引擎的一部分,后来让`BeatriX`打包成了一个`ShellCode`代码,并可以通过`typedef`动态指针的方式直接调用功能,本章内容作为后期`Hook`挂钩的铺垫部分,独立出来也是因为代码太多太占空间一篇文章写下来或很长影响阅读。
203 0
驱动开发:内核LDE64引擎计算汇编长度
|
存储 IDE Java
【精通内核】计算机程序的本质、内存组成与ELF格式
精通真正的高并发编程,不仅仅是API的使用和原理!计算机最基础的程序是怎么组成的呢?本文深入浅出,讲解程序的本质(编译的过程)、组成(程序所需的内存)与格式(ELF),希望读者可以构建计算机从写代码到编译到执行的链路的底层思维。
|
编译器 C语言
Win知识 - 程序是怎样跑起来的——汇编语言和本地代码是一一对应的
Win知识 - 程序是怎样跑起来的——汇编语言和本地代码是一一对应的
111 0
Win知识 - 程序是怎样跑起来的——汇编语言和本地代码是一一对应的
|
数据采集 负载均衡 搜索推荐
会计学包含的两种程序设计思想
会计学包含的两种程序设计思想
会计学包含的两种程序设计思想

热门文章

最新文章