首页 > 编程知识 正文

keil5可以写汇编语言吗,proteus与keil联调

时间:2023-05-05 09:08:25 阅读:134483 作者:3609

快速直接“示例' 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》

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。