GNU汇编风格

                        GNU汇编
                        
注:所有关键字都以‘.’开头
        
一、基本    
    .arch    ISA                                         告诉汇编器当前汇编文件的指令集架构(Instruction Set Architecture)
    {.section}    .section_name{,"flags"}    声明一个段的开始,以下一个段的开始或文件尾结束
                   section_name:
                                 .text        代码段
                                 .data        数据段
                                 .rodata        只读数据段
                                 .bss        未初始化数据段,bss段可以不声明
                                .mysection    自定义段
                  flags:
                         a                可分配段
                         w                可写段
                         x                可执行段
    
    .code        number_of_bits        按number_of_bits设置ARM(32)或Thumb(16)指令
    .global    symbol                符号导出,C默认是导出,不导出要加static,汇编默认是不导出                                                
    .align    power_of_2{,fill_value{,max_padding}}
                        对齐到power_of_2字节,用fill_value或 0(默认值)来填充对齐
                        如需要填充的字节数大于max_padding,则对齐不会发生
    
    alias_name .req register    为register取一个别名,如: aa .req r0,  bb .req aa            
    .include    "filename"    等于 C的#include "filename"
    .err            以一个错误导致汇编结束(是编译文件时结束而不时运行时)
    .end            表示一个汇编文件的结束,剩下的部分可以加注释,一般省略
    #            expr注释            只能放在行的开头,注释至行尾
    @            注释        可放在行的任意位置,注释至行尾
    label_name:        label_name表示当前的地址

                        
二、数据类型
    .ascii    "string"            定义字符串变量,不会在string后面自动加 ‘\0’
    .asciz    "string"            定义字符串变量,会自动加‘\0’
    .byte        byte1{,byte2}...    定义char型变量(1字节),如有多个数据则是定义char数组
    .hword    hword1{,hword2}...        定义short型变量(2字节),如有多个数据则是定义short数组
    .word        word1{,word2}...    定义int型变量(4字节),如有多个数据则是定义int数组
    .space    number_of_byte{,fill_byte}    定义number_of_byte大小的空间,以fill_byte填充,fill_byte默认是 0
        
    注:以上定义的数据类型都是当前段的全局变量 ,还有其它类似的数据类型,如:.string == .asciz, .int == .word,...
    
    .comm        name,number_of_byte{,element_size}        
                    在bss段定义number_of_byte大小的空间,name是该空间的起始地址
                    element_size只是说明每个元素的大小,可以不要
    
三、条件分支
    .if                定义一个条件代码块,以.endif结束
    .ifdef    symbol                """
    .ifndef    symbol                """
    .elseif    expr            使用在.if和.endif之间
    .else                使用在.if和.endif之间
    .endif                条件代码块的结束
    
    
四、循环
    .irp    param {,val1}{,val2}{,val3}...    开启一个循环的代码块,有多少个val就循环多少次,代码块中用\param来代替val    和shell的for i in类似                        
    .rept    number_of_times        开启一个循环的代码块,循环number_of_times次                                        

    .endr                结束.irp和.rept的循环

例:

                        .irp i r1,r2,r3
                            mov    r0,\i
                        .endr
                        
                        .rept 10
                            mov    r0,r1
                        .endr
    
五、宏
    .equ        symbol_name,value        等于C的#define symbol_name value
    .set        variable_name,value        等于.equ
    .macro    name {arg1}{,arg2}{,arg3}...        宏函数
    .exitm                    退出宏函数

    .endm                    宏函数结束

例:

    .macro  NAME a,b
        .if    \a > \b
            mov    r0,#\a
        .elseif \b > 0    
            mov    r0,#\b
        .else
            exitm
        .endif
    .endm
    
    


猜你喜欢

转载自blog.csdn.net/qq910438219/article/details/8155070