快速直接“示例' Keil5内联汇编问题示例说明定义符号和标签多指令嵌入汇编
Keil5内联汇编问题
最近的项目使用协处理器,需要内嵌程序集。
在keil5中使用GCC样式的内联程序集会在返回R1寄存器值之前对R1进行堆栈处理,从而导致无法获得正确的返回值。 因此,返回值必须以Keil指定的格式定义。
我在百度上看到的,都是各种荒谬的回答,所以做了笔记。
其实在官网上。 使用方法如下,通过了测试。
示例编译器提供了内联汇编程序,以便可以在C或C源代码中编写汇编代码。 例如,您可以访问在C或C上不可用的目标处理器的功能。
__asm关键字可以使用GNU内联汇编语法将内联汇编代码合并到一个函数中。 例如:
#includestdio.hintadd(intI,int j ) { int res=0; __ASM(add%[result],%[input_i],% [ input _ j ] ' : [ result ] '=r ' (RES ) : [ input _ I ] ' r3360 (intmain ) void ) { int a=1; int b=2; int c=0; c=add(a,b ); printf(resultof%d%d=%dn )、a、b、c ); }这个例子真的很经典,a是输入,c是输出,多个输入像上面的例子一样用冒号打头,开始新的一行结束。
内联汇编程序不支持用armasm汇编程序语法编写的旧汇编代码。 有关将armasm语法汇编代码迁移到GNU语法的详细信息,请参阅迁移和兼容性指南。
说明__asm内联汇编语句的一般格式如下:
__ASM[volatile](code );/* basicinlineassemblysyntax */* extendedinlineassemblysyntax */_ ASM [ volatile ] (code _ template 3360 output _ () ) 某些volatile修饰符可能会禁用编译器优化。 如果不禁用,编译器可能会删除代码块。 volatile修饰符是可选的,但请考虑在程序集代码块周围使用,以防止编译器在使用-O1或更高版本进行编译时将其删除。
代码是汇编指令,例如“ADD R0、R1、R2”。 code_template是用于汇编指令的模板,例如“ADD %[result]、%[input_i]、%[input_j]”。
如果指定code_template而不是代码,请在指定可选的input_operand_list和clobbered_register_list之前指定output_operand_list
output_operand_list是以逗号分隔的输出操作数列表。 每个操作数由方括号中的符号名称、约束字符串和方括号中的c表达式组成。 在此示例中,有一个输出操作数[result] '=r' (res )。 列表可以为空。 例如:
__ASM(addR0,%[input_i],%[input_i] ) :/* thisisanemptyoutputoperandlist */: [ input _ I ] ) 输入操作数使用与输出操作数相同的语法。 在此示例中,有两个输入操作数: [input_i] 'r' (i,[input_j] 'r' (j )。 列表可以为空。
clobbered_register_list是以逗号分隔的字符串列表。 每个字符串都是可能被汇编代码更改的寄存器的名称,但最终值并不重要。 要阻止编译器在内联汇编字符串中使用模板字符串寄存器,请将寄存器添加到clobber列表中。
例如,如果寄存器包含临时值,则将其包含在clobber列表中。 编译器不应将此列表中的寄存器用作输入/输出操作数,也不应在执行汇编代码时存储其他值。
列表可以为空。 除了寄存器外,该列表还可以包含特殊参数。
“抄送”
这个命令会影响条件代码标志。 “存储器”
这个命令访问未知的存储器地址。 clobbered_register_list中的寄存器必须使用小写而不是大写。 具有clobbered_register_list的命令示例如下:
__ASM(addR0,%[input_i],%[input_i] ) :/* thisisanemptyoutputoperandlist */: [ input _ I ] ) 例如:
_ _ ASM (.global _ _ use _ no _ semi hosting (n (t ); 要定义标签,请在标签名称后使用: 例如:
__ASM(my_label:nt ); 多个指令可以在同一个__asm语句中写入多个指令。 此示例显示了使用__asm语句为Armv8M主流体系结构创建的中断处理程序。
voidhardfault_Handler(void ) ASM(TSTlr,#0x40(n(t ) beqfrom_nonsecure(n ) t ) from _ secure 336666666 MSP n t ' ' from _ non secure 3360nt ' MSP _ nsnt ' ' Mrs ner0,PSP _ nsn ' ' b hard _ fault _ handler _ handler }您可以将上述处理程序代码复制到file.c,然后使用以下命令进行编译:
arm clang-- target=arm-arm-none-eabi-March=arm V8-m.main-sfile.c-ofile.s内置程序集__attribute__
本文实际上来自Keil官方教程
下一篇预定写《尽可能简单的将VSCODE变成IDE》