cg_assemblers.e07
来自「realview22.rar」· E07 代码 · 共 310 行 · 第 1/5 页
E07
310 行
(see <?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1451848><xref linkend = "CHDGBBIA">).<?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 1474306><para> If registers other than <?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1465742><literal>CPSR<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></literal> and <?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1465725><literal>SPSR<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></literal> are
read without being written to, an error message is issued. 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 1451853><programlisting>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;
}<?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 1451858><para>The function must be written as:<?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 1451863><programlisting>int f(int x)
{
int r0;
__asm
{
ADD r0, x, 1
EOR x, r0, x
}
return x;
}<?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] 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 1430047><para>Also, see <?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1430060><xref linkend = "CHDGDDCJ">.<?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 1482051><sect3 id = "CACFHIAC"><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1482054><title>Examples<?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 1482059><para><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1482061><indexterm>These examples demonstrate some of the ways that
you can use inline assembly language effectively:
<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1482310><itemizedlist role = "compressed"><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1482315><listitem><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1482319><para><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1482370><xref
linkend = "CIHHFHJI"><?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 1482338><listitem><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1482341><para><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1482374><xref linkend = "BCFJHCAA"><?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 1482354><listitem><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1482357><para><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1482388><xref linkend = "BCFCIJFG">.<?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 1482078><sect4 id = "CIHHFHJI"><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1482081><title>String copying using a loop<?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 1482086><para><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1482089><xref linkend = "Cacbcefi"> shows inline assembly code that
copies a string value using a loop. This example is for illustration
only, and is not an efficient byte copying routine. This code is
also in the main examples directory, in <?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1482094><filename>...\inline\strcopy.c.<?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMEND 0></filename><?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 1482099><example id = "Cacbcefi"><?FM: DEBUG [I:\docs_build\temp_build_RVCT\DUI0205_rvct_compiler_guide\CG_assemblers.fm] ELEMBEG 1482102><title>String copy with inline assembler<?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 1482107><programlisting>#include <stdio.h>
void my_strcpy(const char *src, char *dst)
{
int ch;
__asm
{
loop:
LDRB ch, [src], #1
STRB ch, [dst], #1
CMP ch, #0
BNE loop
}
}
int main(void)
{
const char *a = "Hello world!";
char b[20];
my_strcpy (a, b);
printf("Original string: '%s'\n", a);
printf("Copied string: '%s'\n", b);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?