Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7823
  • 博文数量: 2
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 9
  • 用 户 组: 普通用户
  • 注册时间: 2015-09-22 11:13
  • 认证徽章:
文章分类
文章存档

2018年(1)

2016年(1)

我的朋友

分类: LINUX

2018-01-16 23:13:39

学习gcc汇编编程,主要是学习gcc中定义的各种伪操作,下面是常见伪操作的说明:
一、 段定义伪操作:

1. 标示段的开始

伪操作:.text,.data,.bss

说明:这三个伪操作分别表示代码段,数据段,未初始化数据段的开始。

2.  定义段指定段的属性。

伪操作:.section
格式为:.section name attr
例如:.section .data,"a"

3.  设置对齐方式

伪操作.align或.balign (.balignl,balignw)

语法格式:


.align  [align] [, data] 
.balign  [align][, data]


说明:align 是一个数值,表示对齐方式,如2,4,8,16等。


data用来指定进行填充的数据。

4.  设置代码位置

伪操作:.org

语法格式:.org length [,data]

说明:.org用来从当前位置开始保留一段空间,并填充设定的值。

length是字节数,表示保留的空间长度。


data用来指定进行填充的数据。

二、  指令集定义伪操作

1.  arm指令集伪操作

伪操作:.arm和.thumb

说明:.arm表示随后的代码是32位arm指令集,.thumb表示随后的代码是16位thumb指令集。

2.  x86指令集伪操作

伪操作:.code 16和.code 32

说明:. code 16表示随后的代码是16位x86指令集,.code 3表示随后的代码是32位x86指令集。它们用于x86平台上。


三、 符号定义
 

1. 符号定义

伪操作:.equ 或 .set

语法格式:

.equ  symbol, value
.set  symbol, value


说明:symbol  是定义的符号名称,可以是已经定义过的符号。


value表示数值或标号。

2.  符号定义

伪操作:.equiv
语法格式:.equiv         symbol, expr

其中:symbol   是定义的符号名称,但不能是已经定义过的符号,这是它和.equ的区别。

value表示数值或标号。

3. 声明全局符号

伪操作:.global或.globl
语法格式:.global symbol


说明:symbol  为要声明的全局符号名称。这样的符号能够在外部模块中引用。


4. 引入外部符号

伪操作:.extern
语法格式:.extern symbol


说明:symbol  为外部模块中定义的符号。


四、 数据定义
 
1. 声明非0结尾的字符串
伪操作:.ascii
语法格式: .ascii str

2.  声明0结尾的字符串

伪操作:.asciz或.string

语法格式:

.asciz  str
.string  str

例如:hello_str : .string "hello"


3. 字节定义

伪操作:.byte
语法格式:.byte  value[, value]…

说明:vaule 为数值或标号。

4.  半字定义
伪操作:.hword或.short

语法格式:
. hword value[, value]…
. short value[, value]…


说明:vaule 为数值或标号。



5.  字定义

伪操作:.word或.int或.long

语法格式:

. word  value[, value]…
. int  value[, value]…
. long  value[, value]…


说明:vaule 为数值或标号。

6.  双字定义

伪操作:. quad
语法格式:.quad value[, value]…

说明:vaule 为数值或标号。

7.  四字定义

伪操作:.octa       
语法格式:.octa   value[, value]…


说明:vaule 为数值或标号。

8.  单精度浮点数定义

伪操作:.float或.single

语法格式:

.float value[, value]…
.single value[, value]…


说明:vaule 为数值或标号。

9.  双精度浮点数定义

伪操作:.double

语法格式:.double value[, value]…

说明:vaule 为数值或标号。


五、 大块数据定义
 

1.   定义大块数据并反复填充

伪操作:.fill

语法格式:.fill repeat [, size][, data]

说明:repeat为填充的次数;size为每次填充的字节数;data为填充的数据。

2.  定义大块数据并用0填充

伪操作:.zero

语法格式:.zero length

说明:length 为数据区长度。

3.  定义大块数据并用指定值填充

伪操作:.space或.skip

语法格式:

.space     length[, data]
.skip        length [, data ]


说明:length 为数据区长度,data为填充的数据。


4.  声明数据缓冲池


伪操作:.ltorg


语法格式:.ltorg


说明:.ltorg主要用于arm中,它将汇编代码中使用-+


此次V 的常量收集起来,形成常量池。


六、 预定义控制伪操作
 
1.  条件编译

伪操作:.if,.else,.endif或.ifdef,ifnotdef,ifndef


语法格式:


.if  expression

......

.else

......

.endif


说明:gcc中也常用#ifdef系列来代替


2.  宏定义

伪操作:.macro,.endm

语法格式:

.macro macroname        [param [,param}…]

......

.endm

说明:定义的宏可以在代码段中调用。



3.  包含文件


伪操作:.include


语法格式:.include "file "


说明:将另一个汇编文件包含到当前文件中。

阅读(328) | 评论(0) | 转发(0) |
0

上一篇:漫谈Linux内核哈希表(1)

下一篇:没有了

给主人留下些什么吧!~~
评论热议
请登录后评论。

登录 注册