汇编程序数据定义
我们之前简单写了一个程序,介绍了汇编程序中的组成部分,汇编程序的编译,连接和执行。但那个程序功能较为简单,并没有数据的处理。
基本数据定义
汇编指令中并没有提供数据定义的功能,而伪指令中提供了,这说明了数据的内存分配是由编译器完成的而非CPU。
常见的 数据定义格式为:数据定义伪指令 数据[,数据2,...]
常用的数据定义伪指令有:db(define byte), dw(define word), dd(define dword)
db 1 ;定义一个字节型数据,其值为1
db 1, 2, 3, 4 ;定义多个字节型数据,其值分别为1,2,3,4
dw 2 ;定义一个字型数据,其值为2
dw 1, 2, 3, 4 ;定义多个字型数据,其值分别为1,2,3,4
dd 1 ;定义一个双字型数据,其值为1
dd 1, 2, 3, 4 ;定义多个双字型数据,其值为1,2,3,4
字符串
我们可以在汇编程序中,用'.......'的方式指明数据是以字符的形式给出的,编译器将把它们转化为相应的ASCII码。
db 'unIX' ;相当于db 75H, 6EH, 49H, 58H
dup伪操作符
dup是一个伪操作符,由编译器识别处理,和db,dw,dd等数据定义伪指令配合使用,用来进行数据的重复。
db 3 dup (0) ;定义了3个字节,它们的值都是0
db 3 dup (1, 2, 3) ;定义了9个字节,分别是1, 2, 3, 1, 2, 3, 1, 2, 3
db 3 dup ('abc', 'def') ;定义了18个字节,是'abcdefabcdefabcdef'
一段安全的空间
我们所定义的数据和所编写的指令,都需要载入内存中才能被CPU所发现,因此我们需要考虑将数据载入到内存时分配在什么地方。而实际上,我们将数据写入任意一段内存空间是很危险的一件事情。
我们是在操作系统提供的环境中工作,操作系统会管理内存,告诉我们什么是可以写入的位置,如果要向内存空间中写入数据的话,我们需要使用操作系统分配给我们的资源,这是一段安全的空间。
**那么该如何实现使用操作系统给我们分配 的内存呢?**有两种方法:
- 在加载程序的时候为程序分配
- 程序在执行的过程中向系统申请(这本书并不讲这种方法)
一个合理的思考是:我们如果不在源程序中做出说明,操作系统如何知道在加载这个程序的时候要给什么部分分配空间。我们通过段定义可以进行内存的获取。(在汇编程序结构那部分会讲到段的内存空间是如何分配的)
数据标号
我们可以在定义数据的时候给数据起一个名称,作为一个数据标号,指代着数据的地址和大小。
hellostring db 'hello wordl$'
table dw 1, 2, 3, 4, 5
这里 的hellostring不仅指明了首字符的地址,也指明了这后面的空间是字符型的。
而table不仅指明了首元素的地址,也指明了后面的空间是字型的,我们可以把这table看作数组名。