MIPSアセンブリクイックスタート


ラベル:MIPSアセンブリアセンブリ言語プログラミング言語快速入門転載翻訳原文
MIPSアセンブリクイックスタート
データ型
1.MIPSは固定長命令を使用し、すべての命令は32ビット長の2.1バイト=8ビット、半文字長=2バイト(32ビット)、1ワード長=4バイト3.1文字空間=1バイト4.1個整形=1ワード長=4バイト5.1文字用一重引用符6.文字列用二重引用符
レジスタ
  • MIPSの下には32個の汎用レジスタ
  • がある.
  • アセンブリでは、レジスタフラグは$で始まる
  • レジスタは、2つの方法があることを示す:1.このレジスタに対応する番号は、例えば$0から$31まで直接使用する.対応するレジスタ名、例えばt 1,t 1,spを用いる、詳細は、乗算および除算にそれぞれ対応する2つのレジスタlo,l o,hi
  • を参照する.
  • 以上の両者については、直接アドレスは存在せず、mfhi(「move from hi」)とmflo(「move from lo」)のそれぞれで対応するコンテンツにアクセスする必要がある.
  • スタックの方向は、高アドレスから低アドレス
  • に向かう.
    MIPSの下の各レジスタ番号と説明
    レジスタ番号
    レジスタ名
    レジスタの用途
    0
    zero
    常に0を返します
    1
    $at
    アセンブリリザーブレジスタ(他の用途では使用できません)
    2-3
    $v0-$v1
    式または関数の戻り値を格納
    4-7
    $a0-$a3
    サブプログラムの最初の4つのパラメータを格納し、サブプログラム呼び出し中に解放する
    8-15
    $t0-$t7
    (temp簡写)一時変数、上呼び出し時に保存しない
    16-23
    $s0-$s7
    (Save or Static略?)静的変数?呼び出し時に保存
    24-25
    $t8-$t9
    (Temp略記)は前の$0-$7の続きであり、属性は$t 0-$t 7と同じである.
    26-27
    $k0-$k1
    (break off略記?)割り込み関数は値を返し、他の用途には使用できません.
    28
    gp|(GlobalPointer略記)は64 k(gp|(G l o b a l P o i n t e r略記)は64 k(2^{16}$)サイズの静的データブロックの中間アドレスを指す
    29
    $sp
    スタックポインタ
    30
    $s8/$fp
    フレームポインタ
    31
    $ra
    アドレスを返します.他の用途には使用できません.
    プログラムこうぞう
    本質は、データ宣言+通常テキスト+プログラム符号化(ファイル接尾辞.sまたは.asm)データ宣言がコードセグメントの後(以前でも問題ありません)にあることです.
    データ宣言
  • データセグメント以降.dataは開始フラグ
  • である
  • が変数を宣言すると、すなわち、ホストメモリに空間
  • が割り当てられる.
    コード#コード#
  • コードセグメント以降.textは開始フラグ
  • である
  • は、実は各命令操作
  • である.
  • プログラム入門はmain:フラグ
  • プログラム終了フラグ(以下参照)
  • コメント
    同C系言語基本テンプレート
    # Comment giving name of program and description of function
    #            (            )
    # Template.s
    #Bare-bones outline of MIPS assembly language program
    
    
               .data       # variable declarations follow this line
                        #       
                           # ...
    
               .text       # instructions follow this line  
                   #                                                                
    main:                  # indicates start of code (first instruction to execute)
                           #    
                           # ...
    
    # End of program, leave a blank line afterwards to make SPIM happy
    #        ,   ?

    データ宣言
    宣言の形式:
       :(      )         

    通常、変数には初期値が付与.space、どのくらいのサイズの空間が必要かを示す必要があります(bytes)
    命令セットのロード/保存
  • メモリにアクセスするにはload/store命令
  • のみが使用可能である.
  • その他はレジスタ動作
  • のみである.
    load
    lw lw register_destination, RAM_sourceメモリからRAMをコピーソースの内容は対応するレジスタに(wはwordを意味し、このデータサイズは4バイト)
    lb lb register_destination, RAM_source同上、lbはload byte
    store
    sw sw register_source, RAM_destinationは、指定されたレジスタのデータを特定のメモリに書き込むことを意味する
    sb sb register_source, RAM_destination同lb
    load immediate
    li li register_destination, value名前の通り、即時数をロード
    即時および間接アドレス
    La(load address直接アドレス)
    例えばla $to,var1は、var 1のメモリアドレスを$toに埋め込むことを示す
    かんせつアドレスしてい
    アドレスはレジスタの内容(ポインタとも理解できる)lw $t2,($t0) load word at RAM address contained in$t 0 into$t 2 sw $t2,($t0) store word in register$t 2 into RAM at address contained in$t 0
    オフセット加算lw $t2,4($t0) load word at RAM address ($t0+4) into register $t2,”4” gives offset from address in register $t0 sw $t2,-12($t0) store word in register $t2 into RAM at address ($t0 - 12),negative offsets are fine
    さんじゅつめいれいセット
  • 最大3オペランド
  • のオペランドはレジスタのみであり、アドレス
  • の出現は許されない.
  • すべての命令は32ビット
  • に統一されている.
      add $t0,$t1,$t2 # $t0 = $t1 + $t2; add as signed (2's complement) integers
    
            sub $t2,$t3,$t4	#  $t2 = $t3 Ð $t4
            addi    $t2,$t3, 5  #  $t2 = $t3 + 5;   "add immediate" (no sub immediate)
            addu    $t1,$t6,$t7	#  $t1 = $t6 + $t7;   add as unsigned integers
            subu    $t1,$t6,$t7	#  $t1 = $t6 + $t7;   subtract as unsigned integers
    
            mult    $t3,$t4        #  multiply 32-bit quantities in $t3 and $t4, and store 64-bit
                        #  result in special registers Lo and Hi:  (Hi,Lo) = $t3 * $t4
                                    hi,lo(hi    , lo    )
            div $t5,$t6        #  Lo = $t5 / $t6   (integer quotient)
                        #  Hi = $t5 mod $t6   (remainder)
                                   lo,       hi
            mfhi    $t0		#  move quantity in special register Hi to $t0:   $t0 = Hi
                                     hi   lo   ,   mfhi, mflo        
            mflo    $t1		#  move quantity in special register Lo to $t1:   $t1 = Lo
                        #  used to get at result of product or quotient
    
            move    $t2,$t3    #  $t2 = $t3

    せいぎょりゅう
    ブランチ(if elseシリーズ)
            b   target      #  unconditional branch to program label target
            beq $t0,$t1,target #  branch to target if  $t0 = $t1
            blt $t0,$t1,target #  branch to target if  $t0 < $t1
            ble $t0,$t1,target #  branch to target if  $t0 <= $t1
            bgt $t0,$t1,target #  branch to target if  $t0 > $t1
            bge $t0,$t1,target #  branch to target if  $t0 >= $t1
            bne $t0,$t1,target #  branch to target if  $t0 <> $t1

    ジャンプ(while,for,gotoシリーズ)
            j   target       #  unconditional jump to program label target
                                   ,         
            jr  $t3		#  jump to address contained in $t3 ("jump register")
                                    ,            

    サブルーチン呼び出し
        jal sub_label   #  "jump and link"

    現在のプログラムカウンタを$raに保存し、$raに保存したカウンタを介して呼び出しに戻る前に呼び出したサブプログラムに他のサブプログラムが呼び出されたとして往復すると、戻りアドレスのタグはスタックで格納される.
    システム呼び出しと入出力(主にSPIMシミュレータ用)
  • はsyscallを使用し、以下の命令は汎用であるべきである.
  • パラメータで使用されるレジスタ:$v 0,$a 0,$a 1
  • 戻り値使用:$v 0
  • Service
    Code in$v 0対応機能の呼び出しコード
    Arguemntsに必要なパラメータ
    Results戻り値
    1つの整数を印刷
    $v0=1
    印刷する整数を$a 0に割り当てます.
    浮動小数点数を印刷
    $v0=2
    印刷する浮動小数点数を$f 12に割り当てる
    ダブル精度浮動小数点数の印刷
    |v0=3
    印刷する2精度浮動小数点数を$f 12に割り当てる
    文字列の印刷
    $v0=4
    印刷する文字列のアドレスを$a 0に割り当てます.
    整数を読み込む
    $v0=5
    読み込まれた整数を$v 0に割り当てます.
    読み取り浮動小数点数
    $v0=6
    読み込んだ浮動小数点数を$v 0に割り当てる
    二重精度浮動小数点数の読み出し
    $v0=7
    読み込んだ二重精度浮動小数点数を$v 0に割り当てる
    文字列の読み込み
    $v0=8
    読み出し文字列アドレスを$a 0に割り当て、読み出し文字列の長さを$a 1に割り当てる
    sbrk(Cのsbrk()関数と同じ)動的割り当てメモリ
    $v0=9
    $a 0=amountが割り当てる空間サイズ、単位目視はバイト
    割り当てられたスペースヘッダを$a 0に渡す
    終了
    \v0=10
    終了
    *印刷された文字列には、.asciizタイプであることを宣言する終端記号(’0’)が必要です.*整数、浮動小数点数、二重精度浮動小数点数などのデータ操作では、行全体が読み出されます.(’’’’で終わる)*文字列を読み取る場合、入力が長すぎると短くなり、短くなっても補完せず、最後に終止符*The sbrk service returns the address to a block of memory containing n additional bytes.This would be used for dynamic memory allocationを加える.