__ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) : "vfpcc");用编译器V6下为什么会报错
时间: 2023-07-05 11:19:19 浏览: 118
在编译器V6下,代码中的__ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) : "vfpcc");可能会报错,原因是编译器V6不再支持GCC风格的内联汇编语法。所以,您需要使用新的内联汇编语法。
新的内联汇编语法如下:
```
__asm volatile ("VMSR fpscr, %0" : : "r" (fpscr) : "vfpcc");
```
其中,__asm是GCC扩展关键字,volatile表示汇编代码是具有副作用的,"VMSR fpscr, %0"表示汇编代码,":"表示分隔符,"r" (fpscr)表示将C语言变量fpscr传递给汇编代码,"vfpcc"表示使用vfpcc寄存器。
请注意,新的内联汇编语法在GCC和Clang编译器中都适用,但在其他编译器中可能会有所不同。
相关问题
__ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) : "vfpcc");在v6编译器
在v6编译器中,该语句与v5编译器中的语句有所不同,因为v6编译器使用了新的指令集架构,即ARMv8-M架构。在ARMv8-M架构中,VFP指令已被废弃,取而代之的是Advanced SIMD指令集和浮点指令扩展(Floating-Point Extension,FPE)。因此,VMSR指令已经不再使用,而是使用了新的指令VMRS。
因此,在v6编译器中,将原来的VMSR指令更改为VMRS指令,修改后的语句如下所示:
```c
__ASM volatile ("VMRS fpscr, %0" : : "r" (fpscr) : "vfpcc");
```
该语句的作用是将传入的fpscr值写入FPSCR寄存器中,以配置和控制FPU的运算精度和舍入方式等。具体的操作是通过汇编指令 `VMRS fpscr, %0` 实现的,其中 `%0` 表示使用第一个输入参数(即fpscr值)替换指令中的占位符,将fpscr值写入FPSCR寄存器中。
需要注意的是,该语句中仍然使用了 `"vfpcc"` 修饰符,表示该指令依赖于VFPcc控制位的设置。这是因为在ARMv8-M架构中,VFPcc控制位已经被替换为了FPEcc控制位,但仍然可以使用VFPcc修饰符来指定FPEcc控制位的设置。
在编译器v6下与__ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) : "vfpcc");相似度最高的代码
如果您正在使用ARM编译器v6,并且需要类似于`__ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) : "vfpcc");`的代码,那么您可以尝试以下代码:
```
__asm volatile ("VMRS r0, fpscr\n\t"
"BIC r0, r0, #0x00370000\n\t"
"ORR r0, r0, #0x00002000\n\t"
"VMSR fpscr, r0");
```
这段代码的作用是将VFP(浮点处理器)状态控制寄存器(FPSCR)中的位15(FTZ位)设置为1。在这段代码中,`VMRS`指令将FPSCR值加载到r0中,`BIC`指令清除r0的位17-20(RMODE位),`ORR`指令将r0的位15设置为1,然后`VMSR`指令将r0的值写回FPSCR寄存器中。
请注意,这段代码是特定于ARM架构和编译器版本的,可能需要进行适当的修改才能在您的代码中使用。如果您不确定如何使用这段代码或如何进行修改,请参考您的编译器和处理器文档,或者咨询相关专业人士。