【汇编语言/底层开发】6、程序中包含多个segment-阿里云开发者社区

开发者社区> jerry.yin> 正文

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


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
【汇编语言/底层开发】11、标识寄存器
除了前述的多种具有特定用途的寄存器之外,8086的CPU中还存在一类特殊的寄存器,称为标识寄存器flag,其每一位可能用来存储特定的信息,主要有以下三类: (1)相关指令的某些执行结果; (2)为CPU执行相关指令提供依据; (3)控制CPU的相关工作方式。
1015 0
【汇编语言/底层开发】10、CALL和RET指令
CALL和RET指令常常用来实现子程序的设计。这两个指令同jmp、loop、jcxz等指令同属于转移指令。 1、ret和retf 转移指令的主要功能就是修改CS和IP或者只修改IP的内容。
1128 0
【汇编语言/底层开发】9、转移指令的原理
可以修改IP或者同时修改CS和IP的指令统称为转移指令。转移指令控制CPU执行内存中某处的代码,其作用相当于C语言中的GOTO。在C语言中并不鼓励使用goto语句,但是在汇编语言中由于没有复杂的流程控制运算符,使用转移指令称为必然。
812 0
iOS开发那些事-如何编译iOS程序
<p>我们从编写到发布应用会经历3个阶段:模拟器上运行调试、设备上运行调试和发布编译,苹果为了防止非法设备和非开发人员调试和发布应用,使用配置概要文件(Provisioning Profiles)控制在设备上运行调试和发布编译阶段,配置概要文件分为两种:开发配置概要文件和发布配置概要文件</p> <p><span id="more-269"></span></p> <p align="cent
1311 0
【汇编语言/底层开发】6、程序中包含多个segment
众所周知的是,我们所开发的应用程序需依赖于操作系统运行,因此应用程序所使用的内存空间必须是安全的,不能与操作系统和其他应用程序相重合。因此,应用程序所需要的空间应当通过操作系统申请。
761 0
SAS进阶《深入解析SAS》之开发多语言支持的SAS程序
SAS进阶《深入解析SAS》之开发多语言支持的SAS程序 1. 多语言支持的应用程序是指该程序在世界给第使用时,其能够处理的数据,以及处理数据的方式、信息展现的方式都符合当地的语言、文化习惯,这要求应用程序运行时,能够自动进行与地区、语言相关的处理,也就是通常所说的国际化。 2. SBCS、DBCS、MBCS 单字节字符集SBCS指在该字符集中的字符最多由2个字
1665 0
【汇编语言/底层开发】5、[BX]和loop指令
1、[bx] 在之前编写的汇编代码中,我们经常使用到[0]、[1]等标志,方括号中的数字表示某个偏移地址,该地址同段地址一起表示某个内存的位置。但是,在实际应用中存在一个问题,masm等编译器实际上不支持[n]这样的写法,在代码中的[1]、[2]实际上会被处理成1、2等数字型常量,而不是我们希望的偏移地址。
894 0
+关注
jerry.yin
毕业于上海大学通信与信息工程学院,从事流媒体和视频编解码的研究与开发工作; 研究领域包括视频编解码标准、视频处理和流媒体技术、移动互联网技术等。
182
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载