如何在MIPS Assembly中将一个字符串复制到另一个字符串

时间:2019-02-20 08:27:46

标签: assembly mips

像标题所示,我有一个“模板”字符串,我想复制到另一个字符串以“重置”该字符串。这是我要执行的操作的示例:

我一开始就有这两个字符串:

.data
blank:        .asciiz "-/-/-/-/-/"  
gameBoard:    .asciiz "-/-/-/-/-/"

我从这两个字符串开始,但是后来我修改了GameBoard,所以它看起来可能像这样:

"X/X/-/O/X/"

但是现在我想重设字符串,可以说它看起来像“空白”,但是我似乎无法正确地复制字符串。这是我尝试的代码,但是我只设法使控制台进入无限循环并冻结:

resetGameBoard:
li $t0,0

lb $t1, blank($t0) 

sb $t1, gameBoard($t0)

add $t0, $t0,1

blt $t0, 10, resetGameBoard 

j main

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

循环计数器初始化有问题。

计数器增量应使用addi而不是add

.data
blank:        .asciiz "-/-/-/-/-/"  
gameBoard:    .asciiz "-/-/-/-/-/"
.text
resetGameBoard:
    li   $t0,0
loop:
    lb   $t1, blank($t0) 
    sb   $t1, gameBoard($t0)
    addi $t0, $t0,1
    blt  $t0, 10, loop
    nop
    j main

请注意,通过将地址作为lb / sb的常量添加到索引寄存器来访问数组的方式是非标准的。它有效,但前提是数据段地址可以用15位编码。

要超越这些限制,数组的地址应存储在寄存器中。

resetGameBoard:
    li   $t0, 0
    la   $t2, blank     #t2=@blank
    la   $t3, gameBoard $t3=@gameBoard
loop:
    lb   $t1, 0($t2) 
    sb   $t1, 0($t3)
    addi $t0, $t0,1
    addi $t2, $t2, 1 #@blank++
    addi $t3, $t3, 1 #@gameboard++
    blt  $t0, 10, loop
    nop
    j main

代码稍长,但是对于实际程序,可以生成任何数组地址。 la(加载地址)是可以在寄存器中写入任意32个地址的宏。也可以通过全局指针寄存器获取地址。这种方法增加了灵活性,并允许例如轻松展开循环等。