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 &#60;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 + -
显示快捷键?