簡體   English   中英

通過arm C內聯匯編器在內存中處理數組

[英]Manipulating an array in memory via the arm c inline assembler

int smplSize = 48;
int Smpl[48];

for(int i = 0; i < smplSize; i++) Smpl[i] = 0x0;
Smpl[smplSize-1] = 0x1;

int *ptrToSmpl = &Smpl[0];

printf("Sample @%p of Size %i :\n",(void*)ptrToSmpl,smplSize);

asm volatile(

             "@ ------------------------------------------------- \n"
             "@ Invert the sample \n"
             "@ ------------------------------------------------- \n"

            //"0:                \n"
            "ldr r2,[r3] \n"
            //"cmp r2,#0x1          \n"
            //"bne 1f             \n"
            "add r2,#0x1       \n"

            //"add r2,#0x1          \n"
            "str r2,[r3]        \n"

            //"ldr r1, .0             \n"
            //"bx  r1             \n"
            //"1:                \n"


            :
            : "r"   (ptrToSmpl)
            : "r3", "memory"

             );

printf("Sample[0] = %i" , Smpl[0]);

編輯:

如您所見,我想通過arm上的內聯匯編器來操作數組的變量,但是我總是遇到段錯誤。 如何在沒有段錯誤的情況下訪問內存?

printf("Hello inline asmTest start!\n\n");

int smplSize = 48;
int Smpl[48];

for(int i = 0; i < smplSize; i++) Smpl[i] = 0x0;
Smpl[smplSize-1] = 0x1;

int *ptrToSmpl = &Smpl[0];

printf("Sample @%p of Size %i :\n",(void*)ptrToSmpl,smplSize);

asm volatile(

             "@ ------------------------------------------------- \n"
             "@ Invert the sample \n"
             "@ ------------------------------------------------- \n"

            //"0:                \n"

            "ldr r2,%[ptrToSmpl] \n"
            //"cmp r2,#0x1          \n"
            //"bne 1f             \n"
            "add r2,#0x1       \n"

            //"add r2,#0x1          \n"
            "str r2,%[ptrToSmpl]        \n"

            //"ldr r1, .0             \n"
            //"bx  r1             \n"
            //"1:                \n"


            :
            : [ptrToSmpl]"r"   (ptrToSmpl)
            :

             );

printf("Sample[0] = %i" , Smpl[0]);

好的,我這樣做了,但是現在我得到一個“ /tmp/cczQDyiw.s | 72 |錯誤:內部定位(類型:OFFSET_IMM)未修復|” 編譯時。

順便說一句:我可以“組織[程序的地址]”內聯的asm代碼嗎?

printf("Hello inline asmTest start!\n\n");

int smplSize = 48;
int Smpl[48];

for(int i = 0; i < smplSize; i++) Smpl[i] = 0x0;
Smpl[smplSize-1] = 0x1;

int *ptrToSmpl = &Smpl[0];

printf("Sample @%p of Size %i :\n",(void*)ptrToSmpl,smplSize);

asm volatile(

             "@ ------------------------------------------------- \n"
             "@ Invert the sample \n"
             "@ ------------------------------------------------- \n"

            "init:                \n"
            "ldr   r0,%[ptrToSmpl] \n"

            "loop :                 \n"
            "ldr r4,[r0]        \n"
            "cmp r4,#0x0          \n"
            "bne  end             \n"

            "add r4,#0x1          \n"
            "str r4,[r0]        \n"

            "add r0,#0x1       \n"


            "b  loop             \n"
            "end:                \n"


            :
            : [ptrToSmpl]"r"   (ptrToSmpl)
            :  "r0" , "r4", "memory"

             );

printf("Sample[0] = %i" , Smpl[0]);

編輯2:

如您在上方看到的,我認為地址定位中仍然存在錯誤。 現在的錯誤消息是:“ / tmp / ccE69oZd.s | 75 |錯誤:未定義的符號r6用作立即值|” 但哪里都沒有r6。

不要對程序集應該使用的寄存器進行硬編碼。 使用%0%1等符號來命名與您要傳遞的參數相對應的寄存器。

如果正確執行此操作,則無需使用"memory"約束。

您應該將%[ptrToSmpl]放在方括號內-您要從寄存器中的地址加載/存儲。

這個ldr r2,%[ptrToSmpl]被翻譯成ldr r2,rX ldr r2,%[ptrToSmpl]廢話

這個ldr r2,[%[ptrToSmpl]] ldr r2,[rX] -正確

此外,在覆蓋編譯器放置的內容時,應將r2放入損壞的寄存器列表中。 在最后一個(第三個)冒號后面添加“ r2”(帶引號)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM