【问题标题】:MIPS- Program to remove strings with a starting UppercaseMIPS-删除带有大写字母开头的字符串的程序
【发布时间】:2022-01-09 07:43:12
【问题描述】:

我想编写一个程序来删除以非小写字母开头的任何字符串,例如“今天是美好的一天”将是今天的一天”,但我很难编写一个到目前为止的函数有一个程序,它只加载第一个字符和第二个字符进行比较,并在不进行任何处理的情况下循环用户输入。我不知道如何从这里移动,似乎无法找到一个合乎逻辑的方法来解决它

.data
input .space 30
prompt: .asciiz "Please enter a sentence "


.text
li $v0,4
li $a0,prompt
syscall
# Read user input
li $v0,8
li $a1,30
la $a0,input
syscall
li $t0,$a0
li $t1,0
loop:
slti $t2,$t1,30
li $t3,1
beq $t2,$t3,EXIT
lb $t4, 0($t0)
lb $t5, 1($t0)
next:
addi $t0,$t0,1
addi $t1,$t1,1
j loop

EXIT:
li $v0,10
syscall

【问题讨论】:

  • 第一次学习汇编时,在汇编中制定算法非常困难。因此,我们的想法是通过将制定算法的关注点和为其制定汇编代码的关注点分开来使其更容易。这可以通过首先用 C 或其他语言制定算法来完成,通过运行它来确保它可以工作,然后翻译成汇编代码。这样,汇编代码中的错误只能来自相对较小的翻译错误,而不是算法问题。用您已经知道的语言制定算法要容易得多。
  • 您的标题和文字与示例不符!您改为删除小写单词。

标签: assembly mips


【解决方案1】:

基本上,您正在寻找的是某种state machine,它可以使用状态变量进行编码,或者甚至更简单地为每个状态使用不同的代码部分,这可能通过 goto 的 (非常适合组装)或者可能是 if-then-else。

除了状态之外,您还需要一个指针变量来引用您的字符串并一次前进一个字符。

状态机根据当前状态的规则,对下一个输入字符执行您定义的操作。每个状态(终端状态除外)查看指向的一个字符并推进指针,采取一些操作(如打印或复制),并确定下一个状态,可能是相同的,也可能是不同的状态。下一个(或相同)状态运行,再次让角色确定其动作和下一个状态。

某些计算问题适用于状态机,尤其是那些需要少量历史记录或内存但不需要动态计算事物的计算问题。 (状态机需要状态来计算事物,并且状态不是动态添加的。所以大量计数需要很多状态。)

状态 1

当您处于状态 1 时,您还没有开始一个单词,因此如果您看到一个非单词字符(如空格),那么您可能会将其复制到输出并保持状态 1。

当您在状态 1 中看到有效的单词字符时,它必须是单词的开头(否则您将处于另一个状态),因此,如果它是大写字母,则输出它并转换到状态 2 ,但如果是小写,则不输出并转换到状态 3。

状态 2

当您处于状态 2 时,您已找到要输出的单词的开头。在状态 2 中,它继续输出单词的其余部分(即取出一个字符,输出它,然后停留在状态 2),直到找到分隔符,然后(输出并)转换回状态 1。

状态 3

当您处于状态 3 时,您已找到要跳过的单词的开头。在状态 3 中,它继续遍历字符而不输出(停留在状态 3)直到找到分隔符,然后转换回状态 1。

状态 4

结束状态,状态机完成,程序可以继续或退出。从任何其他状态看到终端(空字符或换行符)都应该在这里。


如何处理或收集输出是另一回事,您可以一次将一个字符输出到控制台,或者,您可以将要保留的字符收集到另一个字符串(另一个字符数组)中,或者您可以覆盖现有的字符串,这可能是因为 b/c 问题只会缩短字符串(不会延长字符串,这表明使用了第二个缓冲区)。

【讨论】:

    猜你喜欢
    • 2021-09-25
    • 1970-01-01
    • 2017-07-07
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 2016-08-24
    • 1970-01-01
    相关资源
    最近更新 更多