Self-Modifying MIPS Code

2019-08-17 11:45发布

I'm trying to write a program in MIPS that continuously prompts for two integers and prints the sum until the sum is 0. The trick is that if the sum is 13, I need to call a method to change the assembled MIPS code so that

add $t2, $t0, $t1

becomes

and $t2, $t0, $t1

and all subsequent runs of the loop use the and instruction.

I have the summation loop working so that when 13 is the sum the method instMod is called which I want to modify the instruction. Unfortunately, I have no idea where to start and can't find any examples of this online. I assume I need to somehow get the hex code of the add out of the assembled code and replace it with the hex code for the and but I do not know how to do that or if that is the right course of action to take.

# 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

2条回答
男人必须洒脱
2楼-- · 2019-08-17 12:23

Add a label at the instruction you want to replace, e.g:

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

then in your routine 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

The code loads in temporary register $t1 the contents of the instruction you want to replace, and then stores it in the location labelled instruction_to_be_replaced.

The "source" of the instruction goes labelled in instruction_to_replace.

To do this, you need to be able to write on the code section which I assume you have otherwise you would not be asking this question.

查看更多
一夜七次
3楼-- · 2019-08-17 12:40

Try this:

  1. Assemble the instruction that you need to an object file
  2. Extract the hexadecimal of the equivalent machine code
  3. Place a label in front of the code you need to change
  4. mov the hexidecimal from step 2 into the location from step 3 in your instMod section

For this to function the two instructions with operands must be of identical length. If they are not, pad the original or the replacement with nop as appropriate.

查看更多
登录 后发表回答