如何在没有换行符的情况下打印字符串 Mips 汇编语言

How to print an string without the newline Mips Assembly language

我试图让输出与结果(字符串)在同一行。我找到了示例,但其中 none 解释了该过程。我知道字符串必须存储在内存中,然后一点一点地访问它,但是我在这个过程中迷路了。

.data
prompt: .asciiz "Enter your name: "
name: .space 101

result: .asciiz " ...that's the name"
.text
.globl main

main:
    la $a0, prompt
    li $v0, 4
    syscall

    la $a0, name # Get the input
    li $v0, 8
    li $a1,101
    syscall

    la $a0, name # print the result
    li $v0, 4
    syscall

    la $a0, result
    li $v0, 4
    syscall

    li $v0,10
    syscall

问题在于,当您在输入中读取时,新行也会被读取,因此必须将其删除才能满足您的需求。

这是一种方法:

.data
prompt: .asciiz "Enter your name: "
name: .space 101

result: .asciiz " ...that's the name"
.text
.globl main

main:
    la $a0, prompt
    li $v0, 4
    syscall

    la $a0, name # Get the input
    li $v0, 8
    li $a1,101
    syscall

    addi $t1, $t1, 0 # len = 0
len_to_new_line:
    lb $t2, ($a0) # t2 = *a0
    beq $t2, '\n', end # if t2 == '\n' -> stop
    addi $t1, $t1, 1 # len++
    addi $a0, $a0, 1 # a0++
    b len_to_new_line   
end:
    la $a0, name 
    add $a0, $a0, $t1 
    sb $zero, ($a0) # overwrite '\n' with 0

    la $a0, name # print the result
    li $v0, 4
    syscall

    la $a0, result
    li $v0, 4
    syscall

    li $v0,10
    syscall

输出

Enter your name: David
David ...that's the name

编辑:甚至不需要 len,代码可以减少到这个(只有更改的部分)

len_to_new_line:
    lb $t2, ($a0) # t2 = *a0
    beq $t2, '\n', end # if t2 == '\n' -> stop
    addi $a0, $a0, 1 # a0++
    b len_to_new_line   
end:
    sb $zero, ($a0) # overwrite '\n' with 0