2012-11-29 62 views
3

因此,我正在写一个MIPS程序,它将接收一个输入字符串,然后打印该字符串的所有可能的UNIQUE置换。 (也就是说,如果这个词是LoOp,LoOp和LOop是相同的)。如何在MIPS中删除换行符?

为了做到这一点,我知道我需要在我的输入字符串的末尾没有换行符,但我不知道确保它没有添加。这是我到目前为止:

.data 


newLine: 
    .asciiz "\n" 
promptUser: 
    .asciiz "Enter a 20 letter or less word:\n" 
word: 
    .space 21 

.text 

main: 

    la $a0, promptUser 
    li $v0, 4  # Ask User for Input 
    syscall 

    la $a0, word 
    li $a1,21  # Max number of characters 20 
    li $v0,8 
    syscall   # Prompting User 

    la $a0,newLine  # Newline 
    li $v0, 4 
    syscall 

    la $a0, word  # Printing Word 
    li $v0, 4 
    syscall 

'\ n'不包括的唯一时间是当输入的字母数是刚好20.任何建议?

FIX:

这工作:

li $s0,0  # Set index to 0 
remove: 
    lb $a3,word($s0) # Load character at index 
    addi $s0,$s0,1  # Increment index 
    bnez $a3,remove  # Loop until the end of string is reached 
    beq $a1,$s0,skip # Do not remove \n when string = maxlength 
    subiu $s0,$s0,2  # If above not true, Backtrack index to '\n' 
    sb $0, word($s0) # Add the terminating character in its place 
skip: 

回答

0

您可以在从系统调用返回8解析字符串删除字符:

# your code to prompt the user   

    xor $a2, $a2, $a2 
loop: 
    lbu $a3, word($a2) 
    addiu $a2, $a2, 1 
    bnez $a3, loop  # Search the NULL char code 
    beq $a1, $a2, skip # Check whether the buffer was fully loaded 
    subiu $a2, $a2, 2 # Otherwise 'remove' the last character 
    sb $0, word($a2)  # and put a NULL instead 
skip: 

# your code continues here 

另外请注意,你没有储备这个词有足够的空间。你应该保留21个字节与

word: .space(21) 
+0

没有太大的工作。 xor $ a2,$ a2,$ a2的用途是什么? – ErikAGriffin

+0

@ user1739675:它将寄存器$ a2设置为零。你是否在提示单词的系统调用和说'la $ a0,newLine'的行之间加入了一段代码?还有,你是否延迟了分支激活?如果是这种情况,你可以在'bnez $ a3,循环' – gusbro

+0

后添加'nop',我不能发布我自己的答案,lawl。但是使用你的代码作为指导,我能够用下面的代码实现预期的结果。 – ErikAGriffin