You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

汇编语言中如何将字符串存入变量?如何在代码段修改数据段字符串变量?

嘿,这个问题问到点子上了!你已经掌握了在数据段定义字符串并打印的基础用法,那咱们来拆解怎么在代码段里修改或者写入字符串到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:47:36