1

合計が 0 になるまで 2 つの整数を継続的に要求し、合計を出力するプログラムを MIPS で作成しようとしています。トリックは、合計が 13 の場合、アセンブルされた MIPS コードを変更するメソッドを呼び出す必要があることです。

add $t2, $t0, $t1

になる

and $t2, $t0, $t1

ループの後続のすべての実行では、and 命令が使用されます。

合計ループが機能しているため、合計が 13 の場合、命令を変更するメソッド instMod が呼び出されます。残念ながら、どこから始めればよいかわかりませんし、オンラインでこの例を見つけることもできません。アセンブルされたコードからアドの 16 進コードを何らかの方法で取得し、それを and の 16 進コードに置き換える必要があると思いますが、それを行う方法や、それが正しい行動方針であるかどうかはわかりません。

# Nick Gilbert
# MIPS Program to demonstrate self-modifying code

.data
num1Prompt:     .asciiz     "Enter num1: "
num2Prompt:     .asciiz     "Enter num2: "
num1:           .word       0
num2:           .word       0
addOut:         .asciiz     "ADD: "
andOut:         .asciiz     "AND: "

.text
main:
sumLoop:
    la $a0, num1Prompt  #Asking user for num1
    li $v0, 4       #Call code to print string
    syscall     

    li $v0, 5       #Call code to read an int
    syscall
    move $t0, $v0       #Moving read int to $t1

    la $a0, num2Prompt  #Asking user for num2
    li $v0, 4       #Call code to print string
    syscall

    li $v0, 5       #Call code to read an int
    syscall
    move $t1, $v0       #Moving read int to $t2

    add $t2, $t0, $t1   #Adding num1 and num2 together

    la $a0, addOut
    li $v0, 4
    syscall

    move $a0, $t2
    li $v0, 1
    syscall

    beq $t2, 13, instMod    #Calling method to modify add instruction if sum = 13
    bne $t2, 0, sumLoop #If result is not yet 0, ask for new sum

endSumLoop:
    li $v0, 10
    syscall

instMod: #Method to change add instruction to an and instruction
4

2 に答える 2

3

置き換えたい命令にラベルを追加します。例:

instruction_to_be_replaced:
  add $t2, $t0, $t1   #Adding num1 and num2 together

次に、ルーチン instMod で

instMod: #Method to change add instruction to an and instruction
    lw $t1, instruction_to_replace
    sw $t1, instruction_to_be_replaced
    j sumLoop  # go back to your sumLooop

instruction_to_replace:
    and $t2, $t0, $t1

$t1このコードは、置換する命令の内容を一時レジスタにロードし、それを というラベルの付いた場所に格納しinstruction_to_be_replacedます。

命令の「ソース」は、instruction_to_replace でラベル付けされます。

これを行うには、コードセクションに書き込むことができる必要があります。そうしないと、この質問をすることはありません。

于 2015-03-25T23:10:00.287 に答える
1

これを試して:

  1. 必要な命令をオブジェクトファイルにアセンブルします
  2. 同等のマシン コードの 16 進数を抽出する
  3. 変更が必要なコードの前にラベルを配置します
  4. movステップ 2 の 16 進数をinstModセクションのステップ 3 の場所に

これが機能するには、オペランドを持つ 2 つの命令が同じ長さでなければなりません。そうでない場合は、オリジナルまたは置換をnop適切にパディングします。

于 2015-03-25T17:30:52.430 に答える