我有這樣的練習
將下面的C代碼翻譯成RISC-V匯編代碼。假設a、b、i和j的值分別在暫存器x5、x6、x7和x29中。另外,假設暫存器x10持有陣列D的基址。for(i=0; i< a; i ){
for(j=0; j<b; j ){
D[4*j] = i j;
}
我也有帶注釋的解決方案
Loop1:
addi x7, x0, 0 // i = 0.
bge x7, x5, ENDi // while i < a
addi x30, x10, 0 //x30 = &D[0]
addi x29, x0, 0 // j = 0
回圈2。
bge x29, x6, ENDj // while j < b 回圈2.
添加x31, x7, x29 // x31 = i j
sd x31, 0(x30) //D[4*j] = x31
addi x30, x30, 32 // x30 = &D[4*(j 1)]
addi x29, x29, 1 // j
jal x0, LOOP2
ENDj:
Addi x7, x7, 1 // i
jal x0, LOOP1
ENDi。
我不明白的是
sd x31, 0(x30) //D[4*j] = x31
addi x30, x30, 32 // x30 = &D[4*(j 1)]
sd x31, 0(x30)難道不是說我把x31的值存盤在陣列30的第0位嗎?4*j突然從何而來?
而且addi x30, x30, 32 不是意味著x30 = x30 32嗎?而且x30=&D[0]不是在第一個回圈中定義的嗎?j怎么會突然接觸到x30?
uj5u.com熱心網友回復:
這等同于以下內容:
for(int64_t i=0; i<a; i ){
int64_t* x30 = &D[0] 。
for(int64_t j=0; j<b; j ){
*x30 = i j。
x30 = 4; //增加4個元素。
}
}
x30被用作回圈中的 "當前指標"。它指向D陣列中的相關元素。它被初始化為第一個元素,并以4個元素為單位遞增,這模擬了4*j部分。由于你的元素是64位,8位元組,為了增加4個元素,指標的基礎地址應該增加4*8=32位元組。
保持一個當前的指標通常比每次重新計算它更有效,特別是在RISC-V中,因為你不能有一個暫存器偏移(沒有str x31, [x30, x29])。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/320388.html
標籤:
