keiluv3forstm32中怎样实现"nop"指令?

zhongqihu2008   2008-7-2 10:26 楼主
                                 IAR中可以通过asm("nop")实现啊

回复评论 (5)

__asm("NOP");

                                 __asm("NOP");
点赞  2008-7-2 12:59

不可以啊

                                  
点赞  2008-7-2 18:14

看帮助文档

内联汇编程序语法
 
  
 
RealView® Compilation Tools for μVision Compiler User Guide Version 3.1 
 
Home > Using the Inline and Embedded Assemblers > Inline assembler > Inline assembler syntax 

6.1.1. Inline assembler syntax
ARM 编译器支持 asm 关键字 (C++) 或 __asm 关键字(C 和 C++)引入的一种扩展内联汇编程序语法。以下各节介绍这些关键字的语法:

含有 asm 关键字的内联汇编

含有 __asm 关键字的内联汇编

使用 __asm 和 asm的规则

在代码的任何位置,都可以使用 asm 或 __asm 语句。

内联汇编程序支持 ARM 指令全集,包括通用协处理器指令,但不包括  BX, BLX, 和 BXJ 。 

内联汇编程序支持ARMv6的子集。该子集仅包含ARMv6的媒体指令。更多信息请查看 内联汇编操作的限制i 。

含有 __asm 关键字的内联汇编
内联汇编程序用汇编程序标志符调用,其后跟随用大括号括起来的汇编程序指令列表。使用汇编程序标志符的内联汇编程序代码具有下列格式:

对于单行,例如:

__asm("instruction[;instruction]"); // Must be a single string
__asm{instruction[;instruction]}

不能包含注释。

对于多行,例如:

__asm
{
    ...
    instruction
    ...
}

在内联汇编语言块内的任何位置,都可以使用 C或 C++ 注释。

更多相关信息也可查看 使用 __asm 和 asm 的规则 

含有 asm 关键字的内联汇编
ARM 编译器支持 ISO C++ 标准中的asm语法。可以用以下格式来使用内联汇编:

对于单行,例如:

asm("instruction[;instruction]"); // Must be a single string
asm{instruction[;instruction]}

不能包含注释。

对于多行,例如:

asm
{
    ...
    instruction
    ...
}

在内联汇编语言块内的任何位置,都可以使用 C或 C++ 注释。

使用 __asm 和 asm 的规则
在使用 __asm 和 asm 关键字时要遵循以下规则:

如果在同一行有多条指令,则必须用分号 (;) 将它们分开。如果使用双引号,则要保证所有的指令在一对双引号 (") 之内。

如果一条指令需要占用多行,必须用反斜线()符号指定续行。

对于多行的格式,在内联汇编语言块内的任何位置,都可以使用 C或 C++ 注释。但在含有多条指令的同一行不能有嵌入注释。

逗号 (,) 作为汇编语言的一个分隔符,在C语言中的逗号必须在圆括号之内以区别它们。

__asm
{
    ADD x, y, (f(), z)
}

asm 语句必须在 C++ 函数内。在C++的任何地方均可申明 asm 语句。

在内联汇编中的寄存器被当作C/C++的变量。这些寄存器的名字没必要和物理寄存器的名字相关联,(可查看 虚拟寄存器 )。如果没有将寄存器定义为一个C/C++变量,编译器会产生一个警告。

在内联汇编中不需要保存和恢复寄存器值。编译器为你做这些。而且,内联汇编不能直接访问物理寄存器。可查阅 虚拟寄存器  以获得更多相关信息。

如果除 CPSR 和 SPSR 之外的寄存器在写之前读,则会产生错误,例如:

int f(int x)
{
    __asm
    {
        STMFD sp!, {r0}    // save r0 ‑ illegal: read before write
        ADD r0, x, 1
        EOR x, r0, x
        LDMFD sp!, {r0}    // restore r0 ‑ not needed.
    }
    return x;
}

以上函数可以正确地写为:

int f(int x)
{
    int r0;
    __asm
    {
        ADD r0, x, 1
        EOR x, r0, x
    }
    return x;
}

点赞  2008-7-2 23:44

5楼 jwj 

忘了THUMB指令不能出现在内联汇编内

                                  
点赞  2008-7-3 08:45

潜入汇编函数可以

                                  
点赞  2008-7-3 11:39
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复