5

MARSシミュレーターを使ってMIPSアセンブリ言語を独学で学ぼうとしています。

教訓的な理由から、私は疑似命令を使用しないように制限しています。

あるデータのアドレスをレジスターに取得しようとしているときに、 を使用できないために問題が発生しましたla

luiと組み合わせて使用​​しようとしましoriたが、数値を直接ロードするのと同じように、役に立ちませんでした:

  .data
arr:
  .byte 0xa1
  .byte 0xb2
  .byte 0xc3
  .byte 0xd4
  .byte 0xe5
  .byte 0xf6
  .byte 0x7a
  .byte 0x8b
  .byte 0x9c
  .byte 0xad

.text

  lui $s0, mem # <--- mars just gives me errors here :(
  ori $s0, mem # ?? ... 

これは、疑似命令なしで、具体的に MARSを使用して実行できますか? どのように?

前もって感謝します!

4

3 に答える 3

7

変更された質問に答えるために、「これは、疑似命令なしで、具体的にMARSを使用して実行可能ですか?」:MARSドキュメントのクイックスキャンから、そうではないようです。MARSは、教育目的で意図的に制限されているようです。

MIPSで実行されているLinuxOSをシミュレートし、gnuツールチェーンで構築されたコードを実行する完全なMIPSシミュレーターでこれを試してみたい場合は、OVPSimulatorをご覧ください。これは無料で、LinuxとWindowsで動作しますが、おそらく必要以上のものです。

于 2011-09-28T18:56:04.933 に答える
3

lui および ori 命令のデータ セクションのラベルを参照する必要があります。これは、gnu アセンブラー (as) で機能します。

    .data
lab1: .byte 0xa1
...
.text
    lui $s0, %hi(lab1)
    ori $s0, %lo(lab1)
    lw  $s2, 0($s1)
...

%hi および %lo ディレクティブは、マシン コードにラベル「lab1」のアドレスを入れることができるように、リンカーに何が起こっているかを伝えます。

于 2011-09-01T00:02:23.840 に答える
2

あなたのori指示が機能するには、さらに別のオペランドが必要です。私があなたのコードを見た限り、「mem」は既存のラベルではありません。これを試してください:

.data 0x10000000 #or choose any other location
        #pointer section
        .word arr
        #...

        #pointed section
arr:    .byte #...  only as tip, you can separate multiple values with comma
              #behind .byte so that you don't need multiple .byte directives 
        #...

.text
        #...
        lui $s0, 0x1000
        lw $t0, 0($s0)           #get the value of "arr"
        #...

これが機能しない場合、MARS は擬似命令なしではラベル コンテンツを取得できない可能性があります。

于 2015-12-20T19:17:31.580 に答える