Self-Modifying MIPS Code

本小妞迷上赌 提交于 2019-12-12 04:56:30

问题


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

回答1:


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.




回答2:


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.



来源:https://stackoverflow.com/questions/29262391/self-modifying-mips-code

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!