[英]matrix multiplication in ARM assembly
ARM組裝課程最近在我的大學開始,或者分配是創建一個NxM * MxP矩陣乘法程序,從C代碼調用。
現在我對assambler的知識相當有限,但我更願意學習。 我想知道的是:
我在想,我可以自己解決剩下的問題,但這兩點是我覺得很困難的。
我在qemu上使用ARM程序集,在Ubuntu上使用此代碼,它不會在任何特定設備上運行。
C數組只是指針,因此當您將C數組作為參數傳遞給assemply函數時,您將獲得指向作為數組內容的內存區域的指針。
要檢索參數,它取決於您使用的調用約定。 ARM EABI規定:
前四個寄存器r0-r3(a1-a4)用於將參數值傳遞給子程序並從函數返回結果值。 它們也可用於在例程中保存中間值(但通常僅用於子例程調用之間)。
對於簡單的函數,你應該在r0到r4中找到指向數組的指針,具體取決於你的函數簽名。 否則,您將在堆棧中找到它。 一個很好的技術可以准確地找出ABI的內容,即反匯編調用匯編函數的C代碼的目標文件,並在調用Assembly函數之前檢查它的作用。
例如,在Linux上,您可以在名為testasm.c
的文件中編譯以下C代碼:
extern int myasmfunc(int *);
static int array[] = { 0, 1, 2 };
int mycfunc()
{
return myasmfunc(array);
}
然后編譯它:
arm-linux-gnueabi-gcc -c testasm.c
最后得到一個反匯編:
arm-linux-gnueabi-objdump -S testasm.o
結果是:
testasm.o: file format elf32-littlearm
Disassembly of section .text:
00000000 <mycfunc>:
0: e92d4800 push {fp, lr}
4: e28db004 add fp, sp, #4
8: e59f000c ldr r0, [pc, #12] ; 1c <mycfunc+0x1c>
c: ebfffffe bl 0 <myasmfunc>
10: e1a03000 mov r3, r0
14: e1a00003 mov r0, r3
18: e8bd8800 pop {fp, pc}
1c: 00000000 andeq r0, r0, r0
您可以通過將參數放入寄存器r0
來查看單參數函數myasmfunc
。 ldr r0, [pc, #12]
的含義是“加載到r0
內存地址的內容,在pc+12
”。 這是存儲指向數組的指針的地方。
雖然Guillaumes的回答幫了我很多,但我只是想用一些代碼回答我自己的問題。
我最終做的是創建一個一維數組,並將其與維度一起傳遞給asm。
int *p;
scanf("%d", &h1);
scanf("%d", &w1);
int* A =(int *) malloc (sizeof(int) * ( w1 * h1 ));
p=A;
int i;
int j;
for(i=0;i<(w1*h1);i++)
{
scanf("%d", p++);
}
話雖這么說,我分配了另一個數組( malloc
)方式,並將其傳遞給它。 然后我只是在匯編代碼中的相應地址中存儲了我需要的int值,並且因為數組元素的地址沒有改變,所以我只使用相同的數組來輸出結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.