1. 程式人生 > >arm彙編程式呼叫C函式之引數傳遞

arm彙編程式呼叫C函式之引數傳遞

對於ARM體系來說,不同語言撰寫的函式之間相互呼叫(mix calls)遵循的是 ATPCS(ARM-Thumb Procedure Call Standard),ATPCS主要是定義了函式呼叫時引數的傳遞規則以及如何從函式返回,在彙編程式中呼叫C函式的引數傳遞規則:
ATPCS建議C函式的形參不超過4個,如果形參個數少於或等於4,則形參由R0,R1,R2,R3四個暫存器進行傳遞;若形參個數大於4,大於4的部分必須通過堆疊進行傳遞。
示例:
在bootloader的start.s中當需要呼叫C函式將u-boot的程式碼拷貝到sdram時呼叫copy_code_to_sdram函式,它有三個引數,呼叫前將第一個引數源、第二個引數目的、第三個引數長度依次分別存放在r0、r1、r2中,呼叫的時候C函式就會去這三個暫存器讀取引數值,完成引數的傳遞。

    mov r0, #0
    ldr r1, _TEXT_BASE
    ldr r2, _bss_start_ofs

    bl copy_code_to_sdram
void copy_code_to_sdram(unsigned char *src, unsigned char *dest, unsigned int len)
{   
    int i = 0;

    if (isBootFromNorFlash())
    {
        while (i < len)
        {
            dest[i] = src[i];
            i++;
        }
    }
    else
{ nand_read_ll((unsigned int)src, dest, len); } }