[英]ARM Assembly: How to pass and make use of a array of pointers inside an ARM Assembly function
我有一個C函數,其中有4個指針,每個指針都指向大型2D浮點數組的不同位置。
由於只能使用4個參數(r0-r3)傳遞ARM匯編函數,因此我無法理解如何將指針傳遞給返回值,該返回值將成為匯編函數的第5個參數。
因此,為了克服這個問題,我想到將所有4個指針放入一個指針數組中,這樣我將有3個以上的空閑點,使用這些空閑點,我還可以將一個指針傳遞給我的返回值。
但是,我不知道如何從匯編函數內部的指針數組中提取四個單獨的指針。 我的嘗試失敗了。
這是我正在嘗試做的一個示例。
#include<stdio.h>
void _my_arm_asm(float32_t *);
float32_t data_array[100][100];
void main()
{
float32_t *ptr1, *ptr2, *ptr3, *ptr4;
ptr1 = \\ data_array[value] + (some value);
ptr2 = \\ data_array[value] + (some other value);
ptr3 = \\ data_array[value] + (some other value);
ptr4 = \\ data_array[value] + (some other value);
float32_t *array_pointers[4];
array_pointers[0] = ptr1;
array_pointers[1] = ptr2;
array_pointers[2] = ptr3;
array_pointers[3] = ptr4;
float32x4_t result;
_my_arm_asm(array_pointers, &result);
....
....
....
return 0;
}
.text
.global _my_arm_asm
_my_arm_asm:
#r0: Pointer to my array of pointers
#r1: Pointer to my result
push {r4-r11, lr}
# How to access the array of pointers?
# I previously tried this, is this the right way to do it?
# mov r4, #0
# vld4.32 {d0, d1, d2, d3}, [r0, r4]
# add r4, r4, #1
# vld4.32 {d4, d5, d6, d7}, [r0, r4]
# add r4, r4, #1
# vld4.32 {d8, d9, d10, d11}, [r0, r4]
# add r4, r4, #1
# vld4.32 {d12, d13, d14, d15}, [r0, r4]
....
....
....
pop {r4-r11, pc}
通常,如果將一個以上的參數傳遞給一個函數,則多余的參數將傳遞給堆棧。
ARM EABI指定了編譯器應如何將參數傳遞給函數(還指定了調用者在整個函數調用中可以期望保持不變的寄存器)。 您的匯編例程可以使用相同的技術(除非您有充分的理由不這樣做,否則可能應該使用)。 如果沒有其他說明,那意味着可以從C輕松調用您的匯編函數。
“ ARM體系結構的過程調用標准”的第5章(基本過程調用標准)應具有確切的細節。 表面上它非常復雜(因為在對齊,參數大小等方面有很多細節),但我認為出於您的目的,可以歸結為將函數的第5個參數壓入堆棧。
當然,正如您在問題中所建議的那樣,可以通過將4個指針打包到結構中並傳遞一個指向該結構的指針來避免所有這些情況-在匯編例程中,您只需將該結構指針加載到寄存器中並依次使用該指針即可加載您真正需要的指針。
我認為ARM程序集可能看起來像:
// r0 has the 1st parameter
ldr r4, [r0] // get array_pointers[0] into r4
// ...
ldr r5, [r0, #4] // get array_pointers[1] into r5
// ...
ldr r6, [r0, #8] // get array_pointers[2] into r6
您也可以使用“加載多個”指令一次獲得所有4個指針,但是我不確定您注冊的使用要求/限制可能是什么。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.