cg_assemblers.e07
来自「realview22.rar」· E07 代码 · 共 310 行 · 第 1/5 页
E07
310 行
// Must be a single string
__asm{<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1429762><repl>instruction<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></repl>[;<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1429766><repl>instruction<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></repl>]}<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></programlisting>
<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1429771><note>
<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1429778><para>You cannot include comments.<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></para>
<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></note><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></listitem>
<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1429789><listitem><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1429792><para>On multiple lines, for example:<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></para>
<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1429797><programlisting>__asm{
...
<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1429801><repl>instruction<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></repl>
...
}<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></programlisting>
<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1429806><para>You can use C or C++ comments anywhere in an inline assembly
language block.<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1429808><indexterm><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></para><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></listitem><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></itemizedlist><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></para>
<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1430940><para>See <?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1430943><xref linkend = "CIHBEECJ">.<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></para><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></sect3>
<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1421394><sect3 id = "CIHHHBGD"><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1474218><title>Inline assembly with the asm keyword<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></title>
<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1421402><para><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1474255><indexterm><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1474257><indexterm>When compiling C++, the ARM compiler
supports the <?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1474230><keyword>asm<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></keyword> syntax proposed in the ISO <?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1474234>
<indexterm>C++ Standard. You can specify inline assembler code using
the following formats:
<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1421425><itemizedlist><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1421428><listitem><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1421431><para>On a single line, for example:<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></para>
<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1421436><programlisting>asm("<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1421439><repl>instruction<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></repl>[;<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1421443><repl>instruction<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></repl>]");
// Must be a single string
asm{<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1421448><repl>instruction<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></repl>[;<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1421452><repl>instruction<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></repl>]}<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></programlisting>
<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1421457><note>
<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1421464><para>You cannot include comments.<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></para>
<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></note><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></listitem>
<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1421475><listitem><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1421478><para>On multiple lines, for example:<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></para>
<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1421483><programlisting>asm{
...
<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1421487><repl>instruction<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></repl>
...
}<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></programlisting>
<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1421492><para>You can use C or C++ comments anywhere in an inline assembly
language block.<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1422143><indexterm><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></para><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></listitem><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></itemizedlist><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></para><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></sect3>
<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1429219><sect3 id = "CIHBEECJ"><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1429223><title>Rules for using __asm and asm<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></title>
<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1429242><para><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1474291><indexterm><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1474293><indexterm>Follow these rules when using the <?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1474182><keyword>__asm<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></keyword> and <?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1429667>
<keyword>asm<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></keyword> keywords:
<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1429499><itemizedlist><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1429519><listitem><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1429522><para>If you include multiple instructions
on the same line, you must separate them with a semicolon. If you
use double quotes, you must enclose all the instructions within
a single set of double quotes.<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></para><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></listitem>
<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1429534><listitem><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1429537><para>If an instruction requires more than one line, you
must specify the line continuation with the backslash character <?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1429637>
<literal>\<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></literal>.<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></para><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></listitem>
<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1429829><listitem><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1429832><para>For the multiple line format, you can use C or C++
comments anywhere in the inline assembly language block. However,
you cannot embed comments in a line that contains multiple instructions.<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></para><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></listitem>
<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1451480><listitem><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1451483><para>Comma is used as a separator in assembly language,
so C expressions with the comma operator must be enclosed in parentheses
to distinguish them:<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></para>
<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1451490><programlisting>__asm {ADD x, y, (f(), z)}<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></programlisting><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></listitem>
<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1451401><listitem><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1451404><para>An <?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1451407><keyword>asm<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></keyword> statement must be inside
a C++ function. An <?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1451411><keyword>asm<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></keyword> statement can be used anywhere
a C++ statement is expected.<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></para><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></listitem>
<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1451824><listitem><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1451827><para>Register names in the inline assembler are treated
as C or C++ variables. They do not necessarily relate to the physical
register of the same name (see <?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1451831><xref linkend = "CHDGBBIA">). If
you do not declare the register as a C or C++ variable, then the
compiler warns you that it should be declared as a variable.<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></para><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></listitem>
<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1451837><listitem><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1451840><para><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1451842><indexterm><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1451844><indexterm>Do not save and restore registers
in inline assembler. The compiler does this for you. Also, the inline
assembler does not provide direct access to the physical registers
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?