簡體   English   中英

在MIPS組合件中交換陣列中的兩個元素

[英]Swapping two elements in an array in MIPS assembly

我正在嘗試學習MIPS ISA。 如果要在MIPS中執行此功能:

A[2*i]=A[2*k+j];

我將如何處理? 我也很感激我可以閱讀的任何其他內容,即可以閱讀有關如何解決此類問題的鏈接。

我們可以將其分為兩部分:

  1. 計算A [2 * i]和A [2 * k + j]的地址
  2. 將第二個地址處的值分配給第一個地址處的內存

我只想談一談(哼)。

要計算數組元素的地址,您需要了解三件事:

  1. 數組起始地址
  2. 您想要的元素的索引
  3. 數組元素的大小

我假設您知道如何計算或僅知道#1和#3。 剩下#2,涉及簡單的算術運算。 (由於您尚未說明i,j和k的表示方式,因此我在這里不能提供太多幫助)。

然后,最后一步是將索引乘以數組元素的大小。 這使您可以從數組的開始偏移所需元素。 將其添加到數組開頭的地址,即可獲得元素的地址。

PS您要翻譯的代碼不會交換兩個元素; 它復制一個。

已經有一段時間了,但這可能很接近。 不嘗試就不會學習匯編語言。 制作更多示例並編寫代碼。 這里有更多的學習資料。

# int calc(int *A, int i, int j, int k)
# {
#   return A[2 * i] = A[2 * k + j];
# }

# Args: a0=A, a1=i, a1=j, a3=k Rtn: v0
.text
.set nomacro
.set noreorder
.global calc
.ent calc
calc:
sll $t0, $a1, 3   ; t0 = i * 8
sll $t1, $a3, 1   ; t1 = k * 2
add $t1, $t1, $a1 ; t1 += j
sll $t1, $t1, 2   ; t1 *= 4
add $t0, $t0, $a0 ; t0 += A
add $t1, $t1, $a0 ; t1 += A
lw  $v0, 0($t1)   ; r = A[4 * (2 * k + j)]
sw  $v0, 0($t0)   ; A[4 * (2 * i)] = r 
.end calc 

暫無
暫無

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

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