首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

GNU汇编总结 03

GNU汇编总结 03

三, GNU汇编语言结构

################################################################################################

主要包括三个常用的段:

data 数据段 声明带有初始值的元素

bss 数据段 声明使用0或者null初始化的元素

text 正文段 包含的指令, 每个汇编程序都必须包含此段

使用。section 指令定义段, 如:

.section .data

.section .bss

.section .text

起始点:

gnu汇编器使用_start标签表示默认的起始点, 此外如果想要汇编内部的标签能够被外部程序访问,

需要使用。globl 指令, 如:.globl _start

使用通用库函数时可以使用:

ld -dynamic-linker /lib/ld-linux.so.2

################################################################################################

# 四, 数据传递

################################################################################################

1, 数据段

使用。data声明数据段, 这个段中声明的任何数据元素都保留在内存中并可以被汇编程序的指令读取,

此外还可以使用。rodata声明只读的数据段, 在声明一个数据元素时, 需要使用标签和命令:

标签:用做引用数据元素所使用的标记, 它和c语言的变量很相似, 它对于处理器是没有意义的, 它

只是用做汇编器试图访问内存位置时用做引用指针的一个位置。

指令:这个名字指示汇编器为通过标签引用的数据元素保留特定数量的内存, 声明命令之后必须给出

一个或多个默认值。

声明指令:

.ascii 文本字符串

.asciz 以空字符结尾的字符串

.byte 字节值

.double 双精度浮点值

.float 单精度浮点值

.int 32位整数

.long 32位整数, 和int相同

.octa 16字节整数

.quad 8字节整数

.short 16位整数

.single 单精度浮点数(和float相同)

例子:

output:

.ascii "hello world."

pi:

.float 2.14

声明可以在一行中定义多个值, 如:

ages:

.int 20, 10, 30, 40

定义静态符号:

使用。equ命令把常量值定义为可以在文本段中使用的符号,如:

.section .data

.equ LINUX_SYS_CALL, 0x80

.section .text

movl $LINUX_SYS_CALL, %eax

2, bss段

和data段不同, 无需声明特定的数据类型, 只需声明为所需目的保留的原始内存部分即可。

GNU汇编器使用以下两个命令声明内存区域:

.comm 声明为未初始化的通用内存区域

.lcomm 声明为未初始化的本地内存区域

两种声明很相似, 但。lcomm是为不会从本地汇编代码之外进行访问的数据保留的, 格式为:

.comm/.lcomm symbol, length

例子:

.section .bss

.lcomm buffer, 1000

该语句把1000字节的内存地址赋予标签buffer, 在声明本地通用内存区域的程序之外的函数是

不能访问他们的。(不能在。globl命令中使用他们)

在bss段声明的好处是, 数据不包含在可执行文件中。在数据段中定义数据时, 它必须被包含在

可执行程序中, 因为必须使用特定值初始化它。 因为不使用数据初始化bss段中声明的数据区域,

所以内存区域被保留在运行时使用, 并且不必包含在最终的程序中
返回列表