MIPS汇编语言程序中如何将所有小写字母转换为大写字母
How to convert all the lowercase letters to Uppercase letters in MIPS Assembly Language program
打扰一下,有人可以帮我解决这个问题吗?我需要将所有小写字母(例如 "Hello how are you?" 转换为 "HELLO HOW ARE YOU?"、
这是我目前的情况:
.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
有人可以帮我解决这个问题吗?
我需要防止带下划线的 e 出现该错误。
顺便说一句,我不懂伪代码。
你应该:
- 为输入缓冲区保留space
- 检查每个字符是否为小写字母
- 如果不是小写字母则跳过该字符
- 如果是小写就改成大写
这样做你会:
将 firsttyped 中的 .asciiz ""
替换为:
firsttyped: .space 20
在beq $t1, 0, exit
后添加以下行
blt $t1, 'a', not_lower
bgt $t1, 'z', not_lower
并在addi $t0, $t0, 1
前添加标签not_lower
:
not_lower:
作为替代方案,您可以使用 256 个字符的预定义翻译 table,按输入字符值索引,包含翻译后的字符值,其中大部分与输入字符索引相同,除了用于小写到大写的转换。
例如,xlat_table['A'] = 'A'(没有变化),而你也有 xlat_tbl['a'] = 'A'(转换为大写)。
您可以使用其他程序为 table 创建源代码,也可以手动创建。
对部分实际使用 C 示例 table:
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_table['A'] == xlat_table[0x41] == 'A', xlat_table['a'] = = xlat_table[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)
您尝试过从每个字母中减去 dec 32 吗?在 Ascii table 中,char 'A' 的 dec 值是数字 65,char 'a' 是 dec 97,所以 'a' - 32 = 'A' .
如果您需要代码,请询问,我会为您编写。
亲切的问候
打扰一下,有人可以帮我解决这个问题吗?我需要将所有小写字母(例如 "Hello how are you?" 转换为 "HELLO HOW ARE YOU?"、
这是我目前的情况:
.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
有人可以帮我解决这个问题吗? 我需要防止带下划线的 e 出现该错误。
顺便说一句,我不懂伪代码。
你应该:
- 为输入缓冲区保留space
- 检查每个字符是否为小写字母
- 如果不是小写字母则跳过该字符
- 如果是小写就改成大写
这样做你会:
将 firsttyped 中的 .asciiz ""
替换为:
firsttyped: .space 20
在beq $t1, 0, exit
blt $t1, 'a', not_lower
bgt $t1, 'z', not_lower
并在addi $t0, $t0, 1
前添加标签not_lower
:
not_lower:
作为替代方案,您可以使用 256 个字符的预定义翻译 table,按输入字符值索引,包含翻译后的字符值,其中大部分与输入字符索引相同,除了用于小写到大写的转换。
例如,xlat_table['A'] = 'A'(没有变化),而你也有 xlat_tbl['a'] = 'A'(转换为大写)。
您可以使用其他程序为 table 创建源代码,也可以手动创建。
对部分实际使用 C 示例 table:
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_table['A'] == xlat_table[0x41] == 'A', xlat_table['a'] = = xlat_table[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)
您尝试过从每个字母中减去 dec 32 吗?在 Ascii table 中,char 'A' 的 dec 值是数字 65,char 'a' 是 dec 97,所以 'a' - 32 = 'A' .
如果您需要代码,请询问,我会为您编写。
亲切的问候