linux汇编关键字
2013-10-11 16:55
211 查看
在AT&T的语法中,一个节由.section关键词来标识,当你编写汇编语言程序时,至少需要有以下三种节:
.section.data:
这种节包含程序已初始化的数据,也就是说,包含具有初值的那些变量,例如:
hello : .string "Hello world!n"
hello_len : .long 13
.section.bss:这个节包含程序还未初始化的数据,也就是说,包含没有初值的那些变量。当操作
系统装入这个程序时将把这些变量都置为0,例如:
name : .fill 30 #用来请求用户输入名字
name_len :.long 0 #名字的长度
(尚未定义)
当这个程序被装入时,name
和 name_len都被置为0。如果你在.bss节不小心给一个变量赋了初值,这个值也会丢失,并且变量的值仍为0。
使用.bss比使用.data的优势在于,.bss节不占用磁盘的空间。在磁盘上,一个长整数就足以存放.bss节。当程序被装入到内存时,操作系统也只分配给这个节4个字节的内存大小。
注意:编译程序把.data和.bss在4字节上对齐(align),例如,.data总共有34字节,那么编译程序把它对其在36字节上,也就是说,实际给它36字节的空间。
.section.text :这个节包含程序的代码,它是只读节,而.data
和.bss是读/写节。
3.汇编程序指令(Assembler Directive)
上面介绍的.section就是汇编程序指令的一种,GNU汇编程序提供了很多这样的指令(directiv),这种指令都是以句点(.)为开头,后跟指令名(小写字母),在此,我们只介绍在内核源代码中出现的几个指令(以arch/i386/kernel/head.S中的代码为例)。
(1)ascii "string"...
.ascii
表示零个或多个(用逗号隔开)字符串,并把每个字符串(结尾不自动加“0“字节)中的字符放在连续的地址单元。
还有一个与.ascii类似的.asciz,z代表“0“,即每个字符串结尾自动加一个”0“字节,例如:
int_msg:
.asciz "Unknown interruptn"
(2).byte
表达式
.byte表示零或多个表达式(用逗号隔开),每个表达式被放在下一个字节单元。
(3).fill
表达式
形式:.fill
repeat , size ,value
其中,repeat、size
和value都是常量表达式。Fill的含义是反复拷贝size个字节。Repeat可以大于等于0。size也可以大于等于0,但不能超过8,如果超过8,也只取8。把repeat个字节以8个为一组,每组的最高4个字节内容为0,最低4字节内容置为value。
Size和
value为可选项。如果第二个逗号和value值不存在,则假定value为0。如果第一个逗号和size不存在,则假定size为1。
例如,在Linux初始化的过程中,对全局描述符表GDT进行设置的最后一句为:
.fill NR_CPUS*4,8,0
因为每个描述符正好占8个字节,因此,.fill给每个CPU留有存放4个描述符的位置。
(4).globlsymbol
.globl使得连接程序(ld)能够看到symbl。如果你的局部程序中定义了symbl,那么,与这个局部程序连接的其他局部程序也能存取symbl,例如:
.globl SYMBOL_NAME(idt)
.globl SYMBOL_NAME(gdt)
定义idt和gdt为全局符号。
(5)quad bignums
.quad表示零个或多个bignums(用逗号分隔),对于每个bignum,其缺省值是8字节整数。如果bignum超过8字节,则打印一个警告信息;并只取bignum最低8字节。
例如,对全局描述符表的填充就用到这个指令:
.quad 0x00cf9a000000ffff
.quad 0x00cf92000000ffff
.quad 0x00cffa000000ffff
.quad 0x00cff2000000ffff
(6)rept count
把.rept指令与.endr指令之间的行重复count次,例如
.rept 3
.long 0
.endr
相当于
.long 0
.long 0
.long 0
(7)space size , fill
这个指令保留size个字节的空间,每个字节的值为fill。size
和fill都是常量表达式。如果逗号和fill被省略,则假定fill为0,例如在arch/i386/bootl/setup.S中有一句:
.space 1024
表示保留1024字节的空间,并且每个字节的值为0。
(8).wordexpressions
这个表达式表示任意一节中的一个或多个表达式(用逗号分开),表达式的值占两个字节,例如:
gdt_descr:
.word GDT_ENTRIES*8-1
表示变量gdt_descr的置为GDT_ENTRIES*8-1
(9).longexpressions
这与.word类似
(10).
.section.data:
这种节包含程序已初始化的数据,也就是说,包含具有初值的那些变量,例如:
hello : .string "Hello world!n"
hello_len : .long 13
.section.bss:这个节包含程序还未初始化的数据,也就是说,包含没有初值的那些变量。当操作
系统装入这个程序时将把这些变量都置为0,例如:
name : .fill 30 #用来请求用户输入名字
name_len :.long 0 #名字的长度
(尚未定义)
当这个程序被装入时,name
和 name_len都被置为0。如果你在.bss节不小心给一个变量赋了初值,这个值也会丢失,并且变量的值仍为0。
使用.bss比使用.data的优势在于,.bss节不占用磁盘的空间。在磁盘上,一个长整数就足以存放.bss节。当程序被装入到内存时,操作系统也只分配给这个节4个字节的内存大小。
注意:编译程序把.data和.bss在4字节上对齐(align),例如,.data总共有34字节,那么编译程序把它对其在36字节上,也就是说,实际给它36字节的空间。
.section.text :这个节包含程序的代码,它是只读节,而.data
和.bss是读/写节。
3.汇编程序指令(Assembler Directive)
上面介绍的.section就是汇编程序指令的一种,GNU汇编程序提供了很多这样的指令(directiv),这种指令都是以句点(.)为开头,后跟指令名(小写字母),在此,我们只介绍在内核源代码中出现的几个指令(以arch/i386/kernel/head.S中的代码为例)。
(1)ascii "string"...
.ascii
表示零个或多个(用逗号隔开)字符串,并把每个字符串(结尾不自动加“0“字节)中的字符放在连续的地址单元。
还有一个与.ascii类似的.asciz,z代表“0“,即每个字符串结尾自动加一个”0“字节,例如:
int_msg:
.asciz "Unknown interruptn"
(2).byte
表达式
.byte表示零或多个表达式(用逗号隔开),每个表达式被放在下一个字节单元。
(3).fill
表达式
形式:.fill
repeat , size ,value
其中,repeat、size
和value都是常量表达式。Fill的含义是反复拷贝size个字节。Repeat可以大于等于0。size也可以大于等于0,但不能超过8,如果超过8,也只取8。把repeat个字节以8个为一组,每组的最高4个字节内容为0,最低4字节内容置为value。
Size和
value为可选项。如果第二个逗号和value值不存在,则假定value为0。如果第一个逗号和size不存在,则假定size为1。
例如,在Linux初始化的过程中,对全局描述符表GDT进行设置的最后一句为:
.fill NR_CPUS*4,8,0
因为每个描述符正好占8个字节,因此,.fill给每个CPU留有存放4个描述符的位置。
(4).globlsymbol
.globl使得连接程序(ld)能够看到symbl。如果你的局部程序中定义了symbl,那么,与这个局部程序连接的其他局部程序也能存取symbl,例如:
.globl SYMBOL_NAME(idt)
.globl SYMBOL_NAME(gdt)
定义idt和gdt为全局符号。
(5)quad bignums
.quad表示零个或多个bignums(用逗号分隔),对于每个bignum,其缺省值是8字节整数。如果bignum超过8字节,则打印一个警告信息;并只取bignum最低8字节。
例如,对全局描述符表的填充就用到这个指令:
.quad 0x00cf9a000000ffff
.quad 0x00cf92000000ffff
.quad 0x00cffa000000ffff
.quad 0x00cff2000000ffff
(6)rept count
把.rept指令与.endr指令之间的行重复count次,例如
.rept 3
.long 0
.endr
相当于
.long 0
.long 0
.long 0
(7)space size , fill
这个指令保留size个字节的空间,每个字节的值为fill。size
和fill都是常量表达式。如果逗号和fill被省略,则假定fill为0,例如在arch/i386/bootl/setup.S中有一句:
.space 1024
表示保留1024字节的空间,并且每个字节的值为0。
(8).wordexpressions
这个表达式表示任意一节中的一个或多个表达式(用逗号分开),表达式的值占两个字节,例如:
gdt_descr:
.word GDT_ENTRIES*8-1
表示变量gdt_descr的置为GDT_ENTRIES*8-1
(9).longexpressions
这与.word类似
(10).
相关文章推荐
- linux下汇编语言开发总结
- Linux汇编资源
- Linux下常用的配置IP及route的命令汇编
- 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用(Linux)
- Linux 汇编语言开发指南
- Linux c 汇编语言参数传递解析
- linux下搭建汇编环境
- 1.2.在linux环境实践,使用vim编写一个程序,然后使用gcc查看【预处理】、【编译】、【汇编】、【链接】各阶段文件的内容。并熟悉相关指令。
- Linux 汇编语法格式
- Linux 汇编语言开发指南
- linux汇编学习(6)---添加根文件系统
- Linux内嵌汇编
- Linux 汇编语言开发指南
- linux中的size_t关键字
- 让Source Insight支持ARM汇编.S文件关键字高亮,函数支持
- Linux反汇编命令
- GNU ARM汇编--(十五)linux下的printascii
- 我使用过的Linux命令之join - 根据关键字合并数据文件
- Linux(ubuntu)下30天自制os学习引导,第1天(汇编语言,写入u盘,qemu启动u盘)
- Linux 汇编语言开发指南