我认为在具体的例子中解释起来很容易,我理解beq就像r9 == r10这样的语句给出了标签的调用,该标签显示在同一行但我完全不了解其他人。
START: .word 0 .word INSTR1 INSTR1: .word 1 .word 77 .word INSTR2 INSTR2: .word 2 .word 15 .word FIN 鳍: .word 3
acc:
.word 0
.text
.global main
main: movia r8, START
movia r9, acc
myloop: movi r10, 1
ldw r11, 0x0(r8)
beq r11, r0, clear
beq r11, r10, add
addi r10, r10, 1
beq r11, r10, sub
addi r10, r10, 1
beq r11, r10, exit
br fail
clear: stw r0, 0x0(r9)
ldw r8, 0x4(r8)
br myloop
add: ldw r12, 0x0(r9)
ldw r13, 0x4(r9)
addi r12, r12, r13
stw r12, 0x0(r9)
ldw r8, 0x8(r8)
br myloop
sub: ldw r12, 0x0(r9)
ldw r13, 0x4(r9)
sub r12, r12, r13
stw r12, 0x0(r9)
ldw r8, 0x8(r8)
br myloop
exit: ret
fail: movia r12, 0xFFFFFFFF
stw r12, 0x0(r9)
ret
答案 0 :(得分:2)
Movia是一个伪语句,它将32位立即数地址加载到寄存器中。 由于NIOS中的指令宽度固定为32位,因此使用两条指令进行操作:
"load_high_16_bits_and_clear_the_lower_part, register, #imm16_hi"
"or_register_with_16_bit_immediate_at_the_lower_part, register, #imm16_lo"
因为NIOS提供orhi指令,所以可以执行以下操作:
"load_lower_bits_and_clear_the_rest register, #imm16"
"orhi register, #imm16_hi_bits"
movi ==立即行动。同样,该指令只能接受#imm16。
ldw = load“word”== 32位。通过向寄存器添加立即数来计算地址。在这种情况下,指令集仅允许14位位移。
stw = store“word”== 32位。
addi = add immediate:register = register +#imm_16
指令集引用在立即数之前使用希腊符号“sigma”作为执行“符号扩展”的函数的表示法,这意味着复制32位寄存器中的最高有效位(或临时值)允许也签署的立即。 (注意sig_ned与sig_ma)。
修改强>
NIOS中的呼叫机制也需要注意:它使用“滑动窗口寄存器机制”,这意味着处理器具有例如64或256个寄存器,其中只有32个寄存器同时可见。低16位寄存器IIRC是“全局”,16位高位寄存器在每次调用或返回时移位4或8个寄存器。
这意味着寄存器组自动“分配”一些临时变量,这些变量在窗口移位时成为下一个函数调用的输入参数。同样,IIRC,呼叫将返回地址复制到呼叫时的一个特定寄存器(例如r31),在被叫函数处被视为r23(或反之亦然)。 'ret'意味着跳转到'r23'并将寄存器窗口移回。同样,一个可以将几个寄存器返回给调用者。