常用嵌入式汇编限定符

本文详细介绍了GCC内联汇编的各种限定符及其用途,包括通用寄存器、内存操作数、立即数等限定符的含义及使用场景,并解释了如何通过限定符描述输入输出操作数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载文章 http://blog.chinaunix.net/uid-26941022-id-3202417.html

__asm__(

    汇编语句模版:

    输出部分:

    输入部分:

    破坏描述部分:);

即格式为:__asm__ __volatile__("pushfl ; popl %0 ; cli":"=g" (x) )


      分类             限定符                     描述
   通用寄存器       “a”               将输入变量放入eax
                                               这里有一个问题:假设eax已经被使用,那怎么办?
                                               其实很简单:因为GCC 知道eax 已经被使用,它在这段汇编代码
                                               的起始处插入一条语句pushl %eax,将eax 内容保存到堆栈,然
                                               后在这段代码结束处再增加一条语句popl %eax,恢复eax的内容
                             “b”              将输入变量放入ebx
                             “c”              将输入变量放入ecx
                             “d”              将输入变量放入edx
                             “s”              将输入变量放入esi
                             “d”              将输入变量放入edi
                             “q”              将输入变量放入eax,ebx,ecx,edx中的一个
                             “r”               将输入变量放入通用寄存器,也就是eax,ebx,ecx,
                                                edx,esi,edi中的一个
                             “A”               把eax和edx合成一个64 位的寄存器(use long longs)

       内存             “m”             内存变量
                            “o”             操作数为内存变量,但是其寻址方式是偏移量类型,
                                             也即是基址寻址,或者是基址加变址寻址
                           “V”             操作数为内存变量,但寻址方式不是偏移量类型
                            “ ”             操作数为内存变量,但寻址方式为自动增量
                            “p”             操作数是一个合法的内存地址(指针)

  寄存器或内存    “g”             将输入变量放入eax,ebx,ecx,edx中的一个
                                             或者作为内存变量
                           “X”             操作数可以是任何类型

     立即数
                            “I”             0-31之间的立即数(用于32位移位指令)
                           “J”             0-63之间的立即数(用于64位移位指令)
                           “N”            0-255之间的立即数(用于out指令)
                            “i”             立即数  
                           “n”             立即数,有些系统不支持除字以外的立即数,
                                            这些系统应该使用“n”而不是“i”

     匹配              “ 0 ”,        表示用它限制的操作数与某个指定的操作数匹配,
                           “1” ...         也即该操作数就是指定的那个操作数,例如“0”
                           “9”             去描述“%1”操作数,那么“%1”引用的其实就
                                            是“%0”操作数,注意作为限定符字母的0-9 与
                                            指令中的“%0”-“%9”的区别,前者描述操作数,
                                            后者代表操作数。
                            &              该输出操作数不能使用过和输入操作数相同的寄存器

操作数类型         “=”           操作数在指令中是只写的(输出操作数)  
                           “+”           操作数在指令中是读写类型的(输入输出操作数)

     浮点数           “f”             浮点寄存器
                           “t”             第一个浮点寄存器
                           “u”            第二个浮点寄存器
                           “G”           标准的80387浮点常数
                            %            该操作数可以和下一个操作数交换位置
                                           例如addl的两个操作数可以交换顺序
                                         (当然两个操作数都不能是立即数)
                             #            部分注释,从该字符到其后的逗号之间所有字母被忽略
                             *             表示如果选用寄存器,则其后的字母被忽略

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值