ARM彙編和C語言混合程式設計中陣列的陣列的操作

fulinux發表於2018-08-31

ARM彙編和C語言混合程式設計中陣列的陣列的操作

此示例描述a陣列中的元素累加的結果,c和b交換的例項:
·by fulinux(blog.csdn.net/fulinus)

程式碼塊

例如:

#include <stdio.h>

int main (int argc, char **argv)
{
    int a[4] = {1, 2, 3, 4}; 
    int b;

    __asm__ ("MOV R1, %1;"
            "LDMIA R1!, {R2-R5};"
            "ADD R2, R2, R3;"
            "ADD R4, R4, R5;"
            "ADD R2, R2, R4;"
            "MOV %0, R2;"
            :"=r"(b)
            :"r"(a));

    printf ("b = %d\n", b); 

    int c=100,d=200;
    int result;
    __asm__ __volatile__(
            "mov %0,%3\n\t"             //%0是一個佔位符,表示result,之後的類推
            "ldr r0,%1\n\t"
            "ldr r1,%2\n\t"
            "str r0,%2\n\t"
            "str r1,%1\n\t"
            :"=r"(result),"+m"(c),"+m"(d)   
            :"i"(123));

    printf ("c = %d, d=%d, result=%d\n", c, d, result);

    int e[4][2] = {{1, 2}, {3, 4}, {5, 6}, {7,8}};
    int f;
    int *g; 
    int h;

    g = &e[3][1];

    printf ("g=%p, %p\n", g, &e[2][1]);

    __asm__ __volatile__(
            "MOV R0, %2;"
            "MOV R3, #0;"
            "MOV R4, #0;"
            "MOV R5, %3;"
            "LOOP:;"
                "LDMIA R0!, {R1-R2};"
                "ADD R1, R1, R2;"
                "ADD R3, R3, R1;" //sum=sum+R1
                "ADD R4, R4, #1;" //i++
                "CMP R0, R5;"
                "BLE LOOP\n"
                "MOV %0, R3;"
                "MOV %1, R5;"
                :"=r"(f),"=r"(h)
                :"r"(e),"r"(g)
            );  

    printf ("f = %d, h = %p\n", f, h); 

    return 0;
} /* ----- End of main() ----- */

浮點運算舉例:

    double j=0.001;
    short int k = 10; 
    double l;

    asm volatile (
            "vmov s8, %[k]\n\t"
            "vcvt.f64.s32 d6, s8\n\t"
            "vmul.f64 %P[l], %P[j], d6\n\t"
            : [l] "=w" (l) 
            : [j] "w" (j), [k] "r" (k) 
            : "d8", "s8"
            );  

    printf ("l = %f\n", l); 

cmp(Compare)比較指令

cmp:把一個暫存器的內容和另一個暫存器的內容或立即數進行比較。但不儲存結果,只是正確的更改標誌。
一般 cmp 做完判斷後會進行跳轉,後面通常會跟上B指令。

BL 標號:跳轉到標號處執行
B.LT 標號:比較結果是小於(less than),執行標號,否則不跳轉;
B.LE 標號:比較結果是小於等於(less than or equal to),執行標號,否則不跳轉;
B.GT 標號:比較結果是大於(greater than),執行標號,否則不跳轉;
B.GE 標號:比較結果是大於等於(greater than or equal to),執行標號,否則不跳轉;
B.EQ 標號:比較結果是等於,執行標號,否則不跳轉;
B.HI 標號:比較結果是無符號大於,執行標號,否則不跳轉;

作者:原
連結:https://www.jianshu.com/p/7e1eb1d72c83
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。


相關文章