gnu汇编

1. GNU汇编的伪指令

. = _start + 4
        表示当前地址等于标号_start的地址加4
.file   定义一个FILE类型的符号
.text   指明后面段为指令
.data   指明后面段为数据
.comm symbol,length
        申明一个符号名为symbol的通用符号(common symbol).当链接时,目标文件中的通用符号可能被并入其他目标文件中已定义的符号,或者被并入其他目标文件中同名通用符号.如果ld无
法找到该符号的定义,则分配length个字节的未初始化内存.如果ld发现多个同名通用符号,并它们长度不同,则按最大的length值分配内存.

.end    标记着汇编文件的结束,as不处理.end后的任何语句
.abort  停止汇编过程
.ABORT  当生成COFF输出时同.abort; 当生成a.out时忽略它.


函数定义: 只在调试中指明函数name,label是函数的入口点.
.func name[,label]
.endfunc


.equ symbol, expression
        把符号symbol的值设置为expression,同.set
.equiv symbol, expression
        如果symbol已经定义则报错,其他同.equ和.set

.err    打印一条错误信息
.fail expression
        生错一条错误或者警告信息.如果expression的值大于等于500,则打印警告信息,否则打印一条错误信息.

   .global  定义全局符号,例:   .globl   _start

   .align    字节对齐,格式:   .align  {alignment}  {,fill}  {,max}   通过用零或指定的数据进行填充来使当前位置与指定边界对齐,边界基准的定义因系统而有差异.

   .balign[wl]   字节对齐, w:使用2个字节填充, l:使用四个字节填充, 其余参考.align, 不因系统而差异.

   .fill repeat{,size}{,value}   用size个字节的value填充repeat次(size默认为1,value默认为0)

   .zreo size 用0填充size个字节的内存单元

   .space size{,value}   用value填充size个字节的内存单元(value默认为0)

   .skip size{,value}     同.space

   .ltorg 声明一个数据缓冲池(literal pool

   .byte     定义一个字节数据, 例:  .byte  0x20, x011, 0x09, 0x10  (定义4个字节的数据)

   .word    定义一个字,4bytes

   .hword  定义半字, 2bytes

   .quad    定义一个双字, 8bytes

   .octa     定义一个四字, 16bytes

   .float     定义一个 32bit IEEE单精度浮点数

   .single  同.float

   .double 定义一个 64bit IEEE双精度浮点数

   .short    定义短整型数据

   .int        定义一个整型数据

   .long     定义一个长整型数据

   .ascii    定义一个字符串(非零结束符),例:    .ascii "Success.\r\n\0"

   .asciz   定义一个字符串(带零结束符),例:    .asciz "Halted."

   .string  同.asciz

  

   

条件编译:

    .if      .elseif         .else        .endif

.if有多个变种:

.ifdef symbol           @判断symbol是否定义

.ifc string1,string2      @字符串string1和string2是否相等,字符串可以用单引号括起来

.ifeq expression        @判断expression的值是否为0

.ifeqs string1,string2    @判断string1和string2是否相等,字符 串必须用双引号括起来

.ifge expression        @判断expression的值是否大于等于0

.ifgt absolute expression @判断expression的值是否大于0

.ifle expression        @判断expression的值是否小于等于0

.iflt absolute expression    @判断expression的值是否小于0

.ifnc string1,string2        @判断string1和string2是否不相等, 其用法跟.ifc恰好相反。

.ifndef symbol, .ifnotdef symbol @判断是否没有定义symbol, 跟.ifdef恰好相反

.ifne expression          @如果expression的值不是0, 那么编译器将编译下面的代码

.ifnes string1,string2 @如果字符串string1和string2不相 等, 那么编译器将编译下面的代码

宏定义:   

     .macro  MACRO_NAME  PARAM1,PARAM2

           .exitm

     .endm

 

 2. GNU汇编编译器目前也支持C语言的宏定义, 例如 #ifdef,  #define 等, 例如:

               #define MBR(x) (mbr_63_sectors + x)

              movl    $MBR(0), %edx

     汇编中常数前加 $ ,  没加的话代表内存地址.

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值