Assembly MIPS汇编语言程序中如何将所有小写字母转换为大写字母

Assembly MIPS汇编语言程序中如何将所有小写字母转换为大写字母,assembly,mips,uppercase,lowercase,mips32,Assembly,Mips,Uppercase,Lowercase,Mips32,对不起,有人能帮我吗?我需要将所有小写字母(如“你好吗?”)转换为“你好吗?” 以下是我到目前为止的情况: .data firsttyped: .asciiz "" newline: .asciiz "\n" .text main: li $v0, 8 li $a1, 20 la $a0, firsttyped syscall li $v0, 4 li $t0, 0 loop: lb $t1, firsttyped($t0)

对不起,有人能帮我吗?我需要将所有小写字母(如“你好吗?”)转换为“你好吗?”

以下是我到目前为止的情况:

.data
firsttyped: .asciiz ""
newline: .asciiz "\n"

.text
main:
    li $v0, 8
    li $a1, 20
    la $a0, firsttyped
    syscall

    li $v0, 4
    li $t0, 0

loop:
    lb $t1, firsttyped($t0)
    beq $t1, 0, exit
    sub $t1, $t1, 32
    sb $t1, firsttyped($t0)
    addi $t0, $t0, 1
    j loop


exit:
    li $v0, 4
    la $a0, firsttyped
    syscall

    li $v0, 10
    syscall
有人能帮我一下吗? 我需要防止这个错误的发生

顺便说一下,我不懂psuedo代码。

您应该:

  • 为输入缓冲区保留空间
  • 检查每个字符是否为小写字母
  • 如果不是小写字母,请跳过该字符
  • 如果是小写,就用大写
为此,您需要: 将firsttyped中的
.asciiz”“
替换为:

 firsttyped: .space 20
beq$t1,0,exit之后添加以下行

blt $t1, 'a', not_lower
bgt $t1, 'z', not_lower
并将标签
not_lower
添加到
addi$t0,$t0,1
之前:

not_lower:    

作为替代方案,您可以使用一个由256个字符组成的预定义翻译表,该表由输入字符值索引,包含翻译字符值,其中大多数与输入字符索引相同,但大小写转换除外

例如,xlat_table['A']='A'(无更改),而您还可以使用xlat_tbl['A']='A'(转换为大写)

您可以使用另一个程序为表创建源代码,也可以手动创建

对实际表格的部分使用C示例:

unsigned char xlat_table[256] = {
    0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,    // index 0x00
    0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,    // index 0x08
    ...
    0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47     // index 0x40
    ...
    0x60,0x41,0x42,0x43,0x44,0x45,0x46,0x47     // index 0x60
    ...
    0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff};   // index 0xf8
所以xlat_表['A']==xlat_表[0x41]='A',和xlat_表['A']==xlat_表[0x61]='A'。除了[0x61]到[0x7A]==0x41到0x5A之外,所有的值==索引,用于将小写转换为大写,而不影响其他值

我对mips的猜测

xlattbl .byte 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07
        .byte 0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f
        ...

        la      %t3,xlatbl
        ;       $t0 has next byte to translate
        add     $t0,$t0,$t3
        lb      $t0,($t0)

你试过从每个字母中减去12月32日吗?在Ascii表中,字符“A”的dec值是数字65,字符“A”是dec 97,因此“A'-32=”A“

如果你需要代码,只要问我,我会为你写的


亲切问候

谢谢风向标,但是打印出来后,我怎么才能不让句子末尾的小写下划线出现呢?请参见答案:我不是MIPS程序员,但我确实注意到
firsttyped
缺少存储分配。gusbro,在我键入以下内容后,我仍然收到一个错误。在blt和bgt注释处,该行太大。可能您的编译器不喜欢字符常量
'a'
'z'
。尝试用实际值更改它们,即:
blt$t1,97,不低于
bgt$t1,122,不低于
您能用更精确的代码键入它吗?我不喜欢psuedo代码。更好的是:
c&=~0x20
会将小写转换为大写,但保留大写字母不变。