1

特定の例で説明するのは簡単だと思いました。beqはr9==r10のように機能することを理解しました。そのステートメントは同じ行に表示されるラベルを呼び出しますが、他のラベルを正確に理解していませんでした。

START:.word 0 .word INSTR1 INSTR1:.word 1 .word 77 .word INSTR2 INSTR2:.word 2 .word 15 .word FIN 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
4

1 に答える 1

2

Moviaは疑似ステートメントであり、32ビットのイミディエートアドレスをレジスタにロードします。NIOSの命令幅は32ビットに固定されているため、次の2つの命令を使用して発生します。

"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=ストア"ワード"==32ビット。

addi =即時追加:register = register +#imm_16

命令セット参照では、「符号拡張」を実行する関数の表記として、イミディエートの前にギリシャ語の記号「シグマ」を使用します。これは、イミディエートの最上位ビットを32ビットレジスタ(または一時値)全体にコピーすることを意味します。署名された即時。(sig_nedとsig_maに注意してください)。

編集

NIOSの呼び出しメカニズムにも注意が必要です。これは、「スライディングウィンドウレジスタメカニズム」を使用します。つまり、プロセッサには64または256のレジスタがあり、そのうち32のレジスタのみが同時に表示されます。下位16個のレジスタIIRCは「グローバル」であり、呼び出しまたはリターンが行われるたびに、上位16個のレジスタが4または8レジスタをシフトします。

これは、レジスタバンクがいくつかの一時変数を自動的に「割り当て」、ウィンドウがシフトされたときに次の関数呼び出しの入力パラメータになることを意味します。この場合も、IIRCの呼び出しは、呼び出し時にリターンアドレスを1つの特定のレジスタ(たとえばr31)にコピーします。これは、呼び出された関数ではr23(またはその逆)と見なされます。「ret」は「r23」にジャンプしてレジスタウィンドウを元に戻すことを意味します。同様に、いくつかのレジスタを呼び出し元に戻すことができます。

于 2013-01-28T07:33:40.953 に答える