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

How do I copy one string to another in MIPS Assembly

如标题所述,我有一个 "template" 字符串,我想将其复制到另一个字符串,以便 "reset" 字符串。这是我正在尝试做的一个例子:

我在开头有这两个字符串:

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

我从这两个字符串开始,但后来我修改了 gameBoard,使其看起来像这样:

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

但现在我想重置字符串,所以它看起来像 'blank',但我似乎无法正确复制字符串。这是我试过的代码,但我只设法使控制台进入无限循环并冻结:

resetGameBoard:
li $t0,0

lb $t1, blank($t0) 

sb $t1, gameBoard($t0)

add $t0, $t0,1

blt $t0, 10, resetGameBoard 

j main

如有任何帮助,我们将不胜感激!

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

计数器增量应该用 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(load address)是一个宏,可以在一个寄存器中写入任意32个地址。也可以通过全局指针寄存器获取地址。这种方法增加了灵活性,例如,可以轻松展开循环等。