合計が 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