Memory management MIPS:如何在动态内存(堆)中存储字符串

Memory management MIPS:如何在动态内存(堆)中存储字符串,memory-management,mips,Memory Management,Mips,我想写一个子程序,从用户输入中获取一个字符串作为参数,并存储在动态内存中 这就是我想到的: .data name: .space 32 # allocates 32 bytes of memory to store a name namePrompt: .asciiz "name: " .text .globl main main: la $a0, namePrompt li $v0, 4 # system call to prin

我想写一个子程序,从用户输入中获取一个字符串作为参数,并存储在动态内存中

这就是我想到的:

    .data
    name: .space 32 # allocates 32 bytes of memory to store a name

    namePrompt: .asciiz "name: "

    .text
    .globl main

main:

    la $a0, namePrompt
    li $v0, 4 # system call to print a string.
    syscall # print namePrompt.

    la $a0, name # adress where to store the input
    li $a1, 32 # max input size in bytes
    li $v0, 8
    syscall

    la $a0, name # name as first parameter of save_string subroutine
    jal save_string



save_string:

    move $s0, $a0 # s0 = name. 

    # allocate 32 bytes in heap memory.
    li $v0, 9 
    li $a0, 32
    syscall

    sw $s0, 0($v0) # store the name in allocated memory

    jr $ra
但我觉得这不是正确的方法

之后我如何释放空间

但我觉得这不是正确的方法

不,您当前只是将字符串的地址存储在堆分配的内存中。如果要存储其内容,则需要一个循环:

move $s1,$v0
copy:
  lb $t0,($s0)        # Read one byte from the source address
  sb $t0,($s1)        # Store it at the destination address
  addiu $s0,$s0,1
  addiu $s1,$s1,1
  bne $t0,$zero,copy  # Repeat until the NUL terminator has been copied
之后我如何释放空间

假设模拟器的sbrk调用主机操作系统的sbrk,您可以将负值传递给sbrk以缩小程序的堆

但我觉得这不是正确的方法

不,您当前只是将字符串的地址存储在堆分配的内存中。如果要存储其内容,则需要一个循环:

move $s1,$v0
copy:
  lb $t0,($s0)        # Read one byte from the source address
  sb $t0,($s1)        # Store it at the destination address
  addiu $s0,$s0,1
  addiu $s1,$s1,1
  bne $t0,$zero,copy  # Repeat until the NUL terminator has been copied
之后我如何释放空间

假设模拟器的sbrk调用主机操作系统的sbrk,您可以将负值传递给sbrk以缩小程序的堆