像标题所示,我有一个“模板”字符串,我想复制到另一个字符串以“重置”该字符串。这是我要执行的操作的示例:
我一开始就有这两个字符串:
.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
任何帮助将不胜感激!
答案 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个地址的宏。也可以通过全局指针寄存器获取地址。这种方法增加了灵活性,并允许例如轻松展开循环等。