如何在 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个地址。也可以通过全局指针寄存器获取地址。这种方法增加了灵活性,例如,可以轻松展开循环等。
如标题所述,我有一个 "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个地址。也可以通过全局指针寄存器获取地址。这种方法增加了灵活性,例如,可以轻松展开循环等。