簡體   English   中英

ARM程序集中的矩陣乘法

[英]matrix multiplication in ARM assembly

ARM組裝課程最近在我的大學開始,或者分配是創建一個NxM * MxP矩陣乘法程序,從C代碼調用。

現在我對assambler的知識相當有限,但我更願意學習。 我想知道的是:

  1. 如何從C讀取/傳遞2D數組到ASM?
  2. 如何將2D數組輸出回C?

我在想,我可以自己解決剩下的問題,但這兩點是我覺得很困難的。

我在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.

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