GUN汇编格式以及与ARM汇编的转换

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 3.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 

展开阅读全文

没有更多推荐了,返回首页