我是靠谱客的博主 疯狂电灯胆,最近开发中收集的这篇文章主要介绍C语言嵌入式汇编    C语言嵌入式汇编,如下形式 示例1:接口参数汇编中用0% ,1%这种来表示示例2:接口参数汇编中用%[xx]表示,这种更形像,也不用数位置。汇编中的1b, 1f,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

    C语言嵌入式汇编,如下形式

asm volatile("InSTructiON List" : Output : Input : Clobber/Modify);
  1. asm是关键字,必选项
  2. volatile 是可选的,加了,GCC 就不会优化这句。
  3. 汇编指令间必须被双引号括起来;
  4. 汇编指令间必须使用";"、"/n"或"/n/t"分开分开;
  5. ()内的是可选的,如asm volatile("")是可以的,只是无意义
  6. 仅省动其中一项,分号需要加上: 如这个省了输入和输出的,asm volatile ("sync" : : :"memory")
  7. Clobber/Modify表示特定的关键字,让汇编做相应的动作

输入和输出及最后的前缀说明:

  • “=”: 表示只写,常用于输出参数。
  • “+": 表示可读可写
  • "m"、"v"和"o":内存操作单元,V:寻址方式不是偏移量类型;  o:寻址方式是偏移量类型
  • "r": 寄存器单元
  • "i"和"h" :常数
  • "E"和"F":浮点数
  •  "a": 输入变量放入eax
  • "p": 合法的内存指针
  • "memory": 表示通知有内存变动
  • "&": 该输出操作数不能使用和输入操作数相同的寄存器
  • "X": 表示任何类型
  • "*: 表示如果选用寄存器,则其后的字母被忽略
  • # 部分行注释,从该字符到其后的逗号之间所有字母被忽略

 示例1:接口参数汇编中用0% ,1%这种来表示

占位符引用C语言变量,操作数占位符最多10 个,名称如下:%0,%1,...,%9。指令中使用占位符表示的操作数,总被视为long型(4个字节),在%和序号之间插入一个字母,"b"代表低字节,"h"代表高字节,例如:%h0

unsigned val;
asm volatile("lhbrx %0,0,%1"
: "=r" (val)
: "r" (addr), "m" (*addr));
return val;

0% 表示第一个参数, 1%这种数字表示第二个参数,依次类推

0%对应输出参数val, 1%对应输入参数:addr, 需要数位置,且容易搞混。

示例2:接口参数汇编中用%[xx]表示,这种更形像,也不用数位置。

        uint32_t csr_addrh = csr_addr>>32;                              
        uint32_t csr_addrl = csr_addr;                                  
        uint32_t tmp1;                                                  
        uint32_t tmp2;                                                  
                                                                        
        asm volatile (                                                  
            ".set pushn"                                             
            ".set mips64n"                                             
            "dsll   %[tmp1], %[csrh], 32n"                             
            "dsll   %[tmp2], %[csrl], 32n"                             
            "dsrl   %[tmp2], %[tmp2], 32n"                             
            "or     %[tmp1], %[tmp1], %[tmp2]n"                        
            "sd     %[val], 0(%[tmp1])n"                               
            ".set popn"                                            

            : [tmp1] "=&r" (tmp1), [tmp2] "=&r" (tmp2)                  
            : [val] "r" (val), [csrh] "r" (csr_addrh),                  
              [csrl] "r" (csr_addrl)                                    
        );                                                              

GCC上的相关说明:Extended Asm (Using the GNU Compiler Collection (GCC))

伪指令:

.set noreorder/.set reorder : 
不让/让 汇编重排优化指令;
默认是reorder, reorder下不能用nop;
noreorder,下需要自行增加nop来调时序
.set push : 存当前状态
.set pop : 恢复当前状态
.set at/noat :让/不让 汇编使用 $at

汇编中的1b, 1f

#后在的字母:b表示backward, f表示:forward
# b 2f #表示向前跳转到标记2
# b 2b #表示向后跳转到标记2
#实例:
asm volatile(
"
b
2f
n"
"1: lwzx
%0, 0, %1
n"
"
cmpwi
0, %0, 0
n"
"
bne+
1b
n"
"2: lwarx
%0, 0, %1
n"
:"=&r" (a0)
: "r"(a1), "r"(a2)
: "cr0", "memory");

已在如下URL, 我的cnblog上转载:

C语言嵌入式汇编接口参数的两种表法方法 - potac - 博客园

最后

以上就是疯狂电灯胆为你收集整理的C语言嵌入式汇编    C语言嵌入式汇编,如下形式 示例1:接口参数汇编中用0% ,1%这种来表示示例2:接口参数汇编中用%[xx]表示,这种更形像,也不用数位置。汇编中的1b, 1f的全部内容,希望文章能够帮你解决C语言嵌入式汇编    C语言嵌入式汇编,如下形式 示例1:接口参数汇编中用0% ,1%这种来表示示例2:接口参数汇编中用%[xx]表示,这种更形像,也不用数位置。汇编中的1b, 1f所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部