簡體   English   中英

將兩個字符串組合到MIPS匯編中的一個地址

[英]Combine Two Strings to one address in MIPS Assembly

我正在寫一個MIPS程序,用戶輸入他們的名字,然后輸入姓氏,然后系統打印出他們的全名。

我將這兩個名稱存儲在單獨的寄存器中,但在打印全名之前我需要將它們組合成一個。

任何幫助,將不勝感激。 代碼如下:

.data
first:.asciiz "Please enter your first name: \n"
last:.asciiz "Please enter your last name: \n"
full:.asciiz "Your full name is: "
.text 
main:
#    First Name
li $v0, 4              # 4 prints a line
la $a0, first          # Print first name text
syscall                # Syscall

add $a1, $a1, 254      # Setting String length 
li $v0, 8              # 8 will read string
syscall                # calls the word
sw $v0, first
move $v0, $t1          # The name is now in $t1

#   Last Name
li $v0, 4              # 4 prints a line
la $a0, last           # Print last name text
syscall                # Syscall

li $v0, 8              # 8 will read string
syscall                # calls the word
sw $v0, last
move $v0, $t2          # The name is now in $t2

#    Full Name
li $v0, 4              # 4 prints a line
la $a0, full           # Print full name text
syscall  

    # Combine first and last name below

這里需要說的第一件事是你正在使用read-string系統調用錯誤。 您似乎認為系統調用在$ v0中返回一個地址,而事實並非如此。 您可以在此處找到有關MIPS系統調用的一些信息。

第二種情況是,您似乎正在嘗試重新使用您為提示輸入的內存,以獲取用戶的名字和姓氏。 這是一個壞主意。

首先要修復您的數據段:

.data

fprompt:.asciiz "Please enter your first name: "
lprompt:.asciiz "Please enter your last name: "
oprompt:.asciiz "Your full name is: "
first: .space 255 #255 bytes for first name
last:  .space 255 #255 bytes for last name
full:  .space 512 #512 bytes for full name

接下來,必須修復main函數,因為正在使用讀取字符串調用的錯誤約定:

main:

    #Prompt for first name
    li $v0, 4
    la $a0, fprompt
    syscall

    #Enter first name
    la $a0, first
    li $a1, 255
    li $v0, 8
    syscall

    #Prompt for last name
    li $v0, 4
    la $a0, lprompt
    syscall

    #Enter last name
    la $a0, last
    li $a1, 255
    li $v0, 8
    syscall

    #Display output lead-up
    li $v0, 4
    la $a0, oprompt
    syscall

    #call the strcpy function
    move $s0 $ra
    la $a0 first
    la $a1 last
    la $a2 full
    jal strcpy
    move $ra $s0

    #display the full string
    la $a0 full
    li $v0 4
    syscall

    #display a new-line
    li $a0 10
    li $v0 11
    syscall

    #exit
    jr $ra

最后,對於問題的滿足是如何連接兩個字符串。 為此,我使用了一個名為strcpy的獨立函數(應注意與C的strcpy不同)。 strcpy接受$ a0和$ a1中的2個輸入字符串,並將它們復制到$ a2。 它還會在兩者之間留出一個空間,以達到很好的效果。

strcpy:

    li $t8 10 #store newline in $t8

    #loop through first string and copy to output string
   sCopyFirst:

        lb   $t0 0($a0)
        beq  $t0 $zero sCopySpace #exit loop on null byte
        beq  $t0 $t8 sCopySpace   #exit loop on new-line
        sb   $t0 0($a2)
        addi $a0 $a0 1
        addi $a2 $a2 1
        b sCopyFirst

    sCopySpace:

        li   $t0 ' '
        sb   $t0 0($a2)
        addi $a2 $a2 1 

    #loop through second string and copy to output string 
    sCopySecond:

        lb   $t0 0($a1)
        beq  $t0 $zero sDone #exit on null byte
        beq  $t0 $t8 sDone   #exit on new-line
        sb   $t0 0($a2)
        addi $a1 $a1 1
        addi $a2 $a2 1
        b sCopySecond

    sDone:

        sb $zero 0($a2) #null terminate string
        jr $ra

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM