movia,movi,ldw,addi,stw,ldw,ret语句如何工作?

时间:2013-01-28 07:08:21

标签: assembly hardware nios

我认为在具体的例子中解释起来很容易,我理解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

1 个答案:

答案 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'并将寄存器窗口移回。同样,一个可以几个寄存器返回给调用者。