[英]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 天,但我嘗試過的一切都沒有奏效,或者正如我所說,只能“部分”奏效。 如果有人可以幫助我,我將不勝感激。 這是我得到的反饋:
(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
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.