汇编语言中如何将字符串存入变量?如何在代码段修改数据段字符串变量?
嘿,这个问题问到点子上了!你已经掌握了在数据段定义字符串并打印的基础用法,那咱们来拆解怎么在代码段里修改或者写入字符串到str变量里~
核心前提
首先要明确:MIPS汇编里的.data段默认是可写的(除非你手动设置了只读属性),所以我们可以通过寄存器操作,把字符逐个写入到数据段的变量地址中。
方法1:逐个字符覆盖原有字符串
如果你只是想替换掉原来的"abc",比如改成"def",可以直接通过sb(存储字节)指令,把每个字符写入到str对应的内存位置。因为每个ASCII字符占1字节,而且原来的.asciiz已经自动在末尾加了\0(字符串终止符),所以只要覆盖前几个字节就行:
.data str: .asciiz "abc" # 初始字符串,末尾自带\0 .text main: # 先打印原始字符串 li $v0, 4 la $a0, str syscall # 开始覆盖str为"def" la $t0, str # 把str的内存地址加载到$t0寄存器 sb 'd', ($t0) # 将字符'd'存入$t0指向的地址 sb 'e', 1($t0) # 将字符'e'存入$t0+1的地址(偏移1字节) sb 'f', 2($t0) # 将字符'f'存入$t0+2的地址 # 打印修改后的字符串 li $v0, 4 la $a0, str syscall li $v0, 10 # 调用退出系统调用 syscall
方法2:预分配空间存入更长/新的字符串
如果要存入的字符串长度不确定,或者比原来的长,建议用.space提前在数据段分配足够的内存空间,同时记得手动添加字符串终止符\0(因为.space不会自动加):
.data str: .space 20 # 预分配20字节的空间,足够存大多数短字符串 .text main: # 向str存入字符串"hello world" la $t0, str sb 'h', ($t0) sb 'e', 1($t0) sb 'l', 2($t0) sb 'l', 3($t0) sb 'o', 4($t0) sb ' ', 5($t0) sb 'w', 6($t0) sb 'o', 7($t0) sb 'r', 8($t0) sb 'l', 9($t0) sb 'd', 10($t0) sb '\0', 11($t0) # 必须手动加终止符,否则打印会读到垃圾数据 # 打印新字符串 li $v0, 4 la $a0, str syscall li $v0, 10 syscall
注意事项
- 不要直接在
.text段里用.asciiz定义字符串:.text是代码段,实际硬件中通常是只读的,虽然部分模拟器(比如MARS)允许,但这是不符合规范的写法。 - 注意内存越界:如果写入的字符串长度超过了预分配的空间,会覆盖数据段中后面的变量,导致程序出错。
内容的提问来源于stack exchange,提问作者toha
相关产品推荐
相关产品推荐

