В образовательных целях я использовал https://godbolt.org/z/7F-Lhm для перевода
// C++ code
char i = 3;
char A[] = {0,1,2,3,4,5};
int myfunction() {
return A[i];
}
в
# RISC-V instructions
myfunction(): # @myfunction()
lui a0, %hi(i)
lbu a0, %lo(i)(a0)
lui a1, %hi(A)
addi a1, a1, %lo(A)
add a0, a0, a1
lbu a0, 0(a0)
ret
i:
.byte 3 # 0x3
A:
.ascii "\000\001\002\003\004\005"
Но почему A[i]
загружается с add a0, a0, a1
, lbu a0, 0(a0)
, а не только с lbu a0, a0(a1)
?
Было бы разумно, если бы для lbu dest, offset(baseAdress)
только dest
и baseAdresse
могли быть зарегистрированными адресами, тогда как offset
- это жестко запрограммированное число в само слово инструкции. Но в том же коде, приведенном выше, я вижу lbu a0, %lo(i)(a0)
, так что offset
, по-видимому, также может быть «несколько изменчивым»?
Может быть, я не понимаю этого, потому что я действительно не понимаю, почему это $hi $lo
вещь нужна в первую очередь. Почему мы делаем lui a0, %hi(i)
, lbu a0, %lo(i)(a0)
вместо lbu a0, 0(i)
?