3

5 つの命令の制御信号の値を書き留める必要がある宿題を行っており、最初にサンプルを理解しようとしています (下部のコード)。私がする必要がある5つの指示は

Address    Code        Basic                 Source

0x00400014  0x12120004  beq $16,$18,0x0004    15    beq $s0, $s2, exit
0x00400018  0x8e080000  lw $8,0x0000($16)     16    lw  $t0, ($s0)
0x0040001c  0x02118020  add $16,$16,$17       17    add $s0, $s0, $s1
0x00400020  0xae08fffc  sw $8,0xfffc($16)     18    sw  $t0, -4($s0)
0x00400024  0x08100005  j 0x00400014          19    j   loop

そして、彼が行った例は addi $s1,$0,4 です。今、私はこれを持っています:

    Address    Code       Basic                 Source
    0x00400028 0x20110004 addi $16,$0,4         20 addi     $s1, $0, 4   

基本列の 4 は間違っていると思います。正しい答えは何でしょう?

そのために彼が行ったサンプルを次に示します。その下に、彼が参照している制御信号の図を示します。

##--------------------------
# Example
# addi  $s1, $0, 4
# Although not supported as in Figure 4.24, the instruction can be easily
# supported with minor changes in the control circuit.

instruction_address=0x00400028 
instruction_encoding=0x20110004

OPcode=0b001000

Jump=0
Branch=0
Jump_address=0x00440010    # not used in this instruction
Branch_address=0x0040003C  # not used in this instruction

Read_register_1=0b00000
Read_register_2=0b10001
Sign_extend_output=0x00000004 

ALUSrc=1            # pick the value from sign_extend_output
ALUOp=0b00          # assume the same value as load/store instruction
ALU_control_input=0b0010    # add operation, as in load/store instruction

MemRead=0
MemWrite=0
MemtoReg=0          # select the ALU result 

RegDst=0
Write_register=0b10001      #register number for $s1
RegWrite=1

##--------------------------

ここに画像の説明を入力

4

1 に答える 1

4

最初の命令の内訳を調べてみましょう: beq $s0, $s2, exit.

命令アドレスは、上記のアドレス列の下に示されています0x00400014。エンコーディングもあります: 0x12120004. エンコーディングは機械語命令です。命令をバイナリで表現してみましょう: 000100 10000 10010 0000000000000100.

これは I タイプの命令です。最初の 6 ビットのグループはオペコード、2 番目の 5 つのグループはソース レジスタ、3 番目の 5 つのグループは一時レジスタ、最後の 16 ビットのグループは即値です。

オペコードは0b000100. これは I タイプの命令であるため、ターゲットにジャンプしていないため、Jumpシグナルは0. ただし、分岐しているため、Branch信号は1.

を見つけるにはJump_Address、無視されますが、最下位 26 ビットを調べます10000 10010 0000000000000100。アドレスはワード アラインされているため、ジャンプ オフセットを次の命令とターゲット アドレスの符号付き差にすることで、到達可能なアドレスの範囲を拡大できます。つまり、ターゲット アドレスが8次の命令 (PC 相対アドレッシング) からバイト離れている場合2、オフセットを表すために使用します。これが、オフセットを 2 ビット左にシフトする必要がある理由です。したがって、最終的にJump_Address=10 00010 01000 0000000000010000またはになり0x8480010ます。

使用されるを見つけるにはBranch_Address、最下位 16 ビットを調べます0000000000000100。これは、符号拡張され、左に 2 ビット シフトされて取得されます:0000000000000000 0000000000010000または0x00000010. この即値は、次の命令を指すプログラム カウンターに追加されます0x00400018。したがって、最後にBranch_Address=で終了し0x00400028ます。exitラベルは、上で投稿した 5 つの指示の直後、次の指示を指していると思いますj

レジスタは簡単です。Read_register_1=0b10000Read_register_2= 0b10010.

Sign_extend_output、符号拡張されたイミディエイト フィールドです: 0x00000004

ALU 制御信号に進みます。ALUSrcレジスタ ファイルと ALU の間のマルチプレクサを制御します。beq命令では 2 つのレジスタを使用する必要があるため、レジスタ ファイルからレジスタを選択する必要がありますRead data 2addi命令のように、ALU 計算に即値フィールドを使用していません。したがって、ALUSrcです0

およびはALUOpALU_control_inputオペコードから作成される固定値です。ALUOp=0b01ALU_control_input= 0b0110. ページ。323 of Computer Organization and Design、4th。ヘネシーとパターソンによって改訂された版とこのWeb ページには、beq命令の適切な制御信号の表があります。ページ。318 には、ALU 制御ビットのマッピングを含むテーブルがあります。

MemReadメモリにアクセスしていないためですMemWrite。is (don't care) is because is 0; これは、レジスタ ファイルに書き込みを行っていないためです。は0 です。最後に、 を見つけるには、ビット 16 ~ 20 を取得します (命令メモリとレジスタ ファイルの間のマルチプレクサを見てください) 。0MemToRegXMemWriteRegWrite0RegDstXRegWriteWrite_register0b10010

于 2012-04-08T17:48:01.397 に答える