在 mips 中从 "string" 中删除一个字符

deleting a char from a "string" in mips

我想从 MIPS 汇编语言的字符串中完全删除某些字符(数字)

我找到了一种方法来识别哪些需要删除并尝试替换它们,但我还没有找到一个简单的空白 ascii 值(不是 ' ' 中的 space,而是只是'') 并使用 '' 会导致错误。 我的代码在下面有详细的评论。它有效,但我还没有找到合适的字符来使用。 我的问题是有没有办法用替换删除一个字符?或者我需要做一些地址操作来丢失我不想要的字符吗?

        .data
    
str:    .asciiz "i wa32n099na r9epl87ac2156e al6l52 15numb5e1rs in here"
    .text
    
main:   nop                     #main starts here
    
    la $a0, str             #load address of str into a0
    la $t5, str
    
    li $t1, '*'             #load '*' into t1       this is the replacing bit so i wanna load a blank here
    li $t2, '0'             #this will be used as the min val t2
    li $t3, '9'             #this is max val t3
    
loop:
    lb $t0, ($t5)           #load the first byte of str into t0
    
    beq $t0, $zero,done     #stop condition if equals [=11=]
    
    bgt $t0,$t3,continue    #if first byte(asciival) is greater than '9' than it isnt a number, so continue. on false it will check if num is below 0
    blt $t0,$t2,continue    #if first byte(asciival) is smaller than '0' and than it isnt a number, so continue
    
                            #if we got here than byte is a num
    sb $t1, ($t5)           #store the byte in first position (of moved addr)
    
continue:   


    
    addi $t5,$t5,1          #increment the address
    j loop                  #loop up!
    
done:   


    li $v0, 4               #load string read into v0
    
    syscall
    
    jr $ra

如果要从 integers/words 的数组中删除一个元素,我们不会寻找一个特殊的值来将该元素标记为无效;一个人会像彼得说的那样,通过重新定位后续元素来缩小差距,有效地缩短原位数组。

同样适用于字符串,也是数组:字符串是bytes/characters.

的数组

要理解为什么删除元素比覆盖它更好,请考虑我们可以用字符串做的除了打印之外的其他事情:例如,我们可以比较它们,我们可以询问它们的长度,我们可以提取单个字节,搜索子字符串,将它们保存到文件中供其他程序稍后使用,等等。

对于随机位置的有趣字符,所有这些操作要么不起作用,要么需要特殊的外壳。最好完全删除缩短字符串的不需要的字符,而不是用具有特殊含义的字符覆盖它们。


此外,与没有 zero-width ASCII 字符类似,对于 integer/word 数组,没有特殊的元素值可供选择——所有可能的值都已经具有数字意义。