MIPS交换功能

时间:2018-03-21 00:44:48

标签: assembly mips mips32

从我今天的问题历史中可以明显看出,我正在开发一个MIPS项目,该项目将反转字符串,在本例中为“Hello,World”。我想我的循环和字符串反转函数是正确的,但我无法弄清楚交换函数本身,或者如何输出被操纵的字符串。

我知道这样的基本交换是:

sll $t1, $a1, 2
add $t1, $a0,$t1
lb $t0,0($t1)
lb $t2, 4($t1)

sb $t0,0($t1)
sb $t2, 4($t1)
jr $ra

但我不知道那是做什么或如何解释它以适应我的代码。如果那里有一些神圣的圣徒可以解释它是如何工作的以及系统调用是如何工作的,那么我将永远感激不尽。我的代码如下:

.data 

    string: .asciiz "Hello, World!"

.text
main:
    li $v0, 4
    la $a0, string #store string in a0
    syscall



    jal stringreverse

stringreverse:
    add $t0,$a0,$zero   #base address of string
    add $a1, $zero,14   #stores size of string in a1
    addi $t2, $a1, -1   #j = length -1
    add $t3,$zero,$zero     #i = 0

loop:
    jal swap
    addi $t2,$t2,-1     #j--
    addi $t3,$t3,+1     #i++

    slt  $t7,$t3,$t2 #set t7 to 1 when j is less than i
    bne  $t7,$zero,loop # if i is greater than j, keep looping
    j done
swap:   #swaps the sooner element with the later and returns back to the loop
    lb      $v0,0($t3)              # updated to fit my registers t3 =i
    lb      $v1,0($t2)              # updated to fit my registers t2 =j

    sb      $v1,0($t3)              
    sb      $v0,0($t2)              

    jr $ra

done:
    .....procedure here.....
    syscall 

1 个答案:

答案 0 :(得分:0)

看起来你像l(加载地址指令)一样处理lb(加载字节指令)。

你可能想做更像这样的事情:

swap:
    lb    $temp1,   str($t2)    #load temp1 address with byte at $t2 in str 
    lb    $temp2,   str($t1)    #load temp2 address with byte at $t1 in str
    sb    $temp2,   str($t2)    #store temp2 byte into $t2'th position in str
    sb    $temp1,   str($t1)    #store temp1 byte into $t1'th position in str
    jr    $ra

有一些数据,如:

.data
str:
    .asciiz "your string here"

希望这能为你解决一些问题。