簡體   English   中英

在 arm 程序集中查找數組中的最小元素

[英]Finding the smallest element in array in arm assembly

我有這個程序,我必須在 arm 程序集中編寫它來查找數組中的最小元素。 通常這在每種編程語言中都很容易做到,但我無法理解我在 arm 程序集中做錯了什么。 我是 arm 的初學者,但我知道 c 的方式。 所以我寫了關於如何在 c 中的數組中找到最小數字的算法,就像這樣。

int minarray = arr[0];
    for (int i =0; i < len; i++){
        if (arr[i] < minarray){
            minarray = arr[i];
        }

這很容易,真的沒什么特別的。 現在我嘗試接管 arm 中的算法幾乎相同。 有兩件事從一開始就已經被編程。 第一個元素的地址存儲在寄存器 r0 中。 數組的長度存儲在寄存器 r1 中。 最后,最小的元素必須存儲回寄存器 r0。 這是我所做的:

這與 c 中的算法幾乎相同。 首先,我將第一個元素加載到新的寄存器 r4 中。 現在第一個元素是最小的。 然后再一次,我在 r8 中加載第一個元素。 我比較這兩個,如果 r8 <= r4,則將 r8 的內容復制到 r4。 之后(因為我正在使用 32 位的數字)我將 4 字節添加到 r0 以進入數組的下一個元素。 之后,我從數組長度中減去 1 以循環遍歷數組,直到其低於 0 以停止程序。 我從測試 function 中得到的反饋是為了檢查我們的程序是否有效,這表明它部分有效。 它說它適用於長度為 0 的短 arrays 和 arrays 但不適用於長 arrays。 我真的迷路了。 我認為我犯了一個非常愚蠢的錯誤,但我找不到它,我已經被這個簡單的問題困擾了 3 天,但我嘗試過的一切都沒有奏效,或者正如我所說,只能“部分”奏效。 如果有人可以幫助我,我將不勝感激。 這是我得到的反饋:

  • ✗ min 適用於其他數字
  • ✗ min 適用於長數組
  • ✓ min 適用於短數組
  • ✓ min 容忍 size = 0

(x 表示“它不起作用”,✓ 表示“它起作用”)

所以你明白我在說什么嗎? 我只是不明白如何實現它應該與更長的數組一起工作的事實。

我不太擅長 ARM 組裝,據我了解,R4 有望保持最小值。 R8 用於保存從輸入數組中獲取的最新值。

使用此指令更新最小值:

MOVLE   r8, r4

但它實際上更新了 R8,而不是 R4。

嘗試:

MOVLE   r4, r8

編輯

其他問題是使用不正確的分支指令:

SUBS    r1, r1, #1 
BPL     loop1

像這樣工作:

r1 = r1 - 1
if (r1 >= 0) goto loop1;

對於 R1 等於1 ,循環執行兩次

r1 = 1
... do stuff
r1 = r1 - 1 // r1 is 0 now
if (r1 >= 0) goto loop1;     // 0>=0 TRUE!
... do stuff, overflow the input by indexing at `[r0 + 4]`
r1 = r1 - 1 // r1 is -1
if (r1 >= 0) goto loop1;     // -1 >= 0   FALSE
// exit function

要修復它,僅在輸入非零時使用分支。

BNE loop1
  1. C 中的編碼使用正確的類型
  2. 您不必僅從索引0迭代1
int foo(const int *arr, size_t len)
{
    int minarray = arr[0];
    for (size_t i = 1; i < len; i++)
    {
        if (arr[i] < minarray)
        {
            minarray = arr[i];
        }
    }
    return minarray;
}

它生成以下代碼:

foo:
        mov     r3, r0
        subs    r1, r1, #1
        ldr     r0, [r3], #4
        beq     .L1
.L3:
        ldr     r2, [r3], #4
        cmp     r0, r2
        it      ge
        movge   r0, r2
        subs    r1, r1, #1
        bne     .L3
.L1:
        bx      lr

暫無
暫無

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

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