我正在尝试创建一个可以显示字符ascii值的程序。问题是它不显示真正的ascii值。我在MIPS程序集中制作这个代码,它与普通汇编语言非常相似。这是代码:
.data
User: .asciiz "Bush"
Line: .asciiz "\n"
Address: .word User
.text
main:
li $t0,1
li $t1,2
li $t2,3
li $t3,4
li $t4,5
lb $a0,User($0)
li $v0,1
syscall
la $a0,Line
li $v0,4
syscall
lb $a0,User($t0)
li $v0,1
syscall
la $a0,Line
li $v0,4
syscall
lb $a0,User($t1)
li $v0,1
syscall
la $a0,Line
li $v0,4
syscall
lb $a0,User($t2)
li $v0,1
syscall
la $a0,Line
li $v0,4
syscall
lb $a0,User($t3)
li $v0,1
syscall
la $a0,Line
li $v0,4
syscall
li $t1,-1
jal Length
j Exit
Length:
beq $a0,0,End
addi $t1,$t1,1
lb $a0,User($t1)
j Length
End:
move $a0,$t1
li $v0,1
syscall
jr $ra
Exit:
li $v0,10
syscall
可能的原因是它没有显示真正的ascii值。此外,当我尝试制作一个找到所有英文字母的ascii值的程序时,我会遇到运行时错误。如果有人可以帮我这个,那将对我很有帮助。
此致
答案 0 :(得分:1)
您期望它做什么以及它目前做什么?这是我的输出:
66
117
115
104
0
4
如果您希望显示实际字母,请使用向量11而不是1 syscall
,即print character vector:
B
u
s
h
4
lb $a0,User($0)
li $v0,1
syscall
这会从User
的地址加载一个字节并将其放入$a0
。然后,它将值打印为整数。 User
处的值是ASCII字母'B'的值,即66,因此它打印66.这不正确吗?
la $a0,Line
li $v0,4
syscall
这会将Line
的地址放入$a0
,然后打印存储在该地址的字符串。在这种情况下,它是换行符字符串,因此打印换行符。这是正确的。
lb $a0,User($t0)
li $v0,1
syscall
这几乎与第一个块相同,除了现在我们有一个$t0
的地址偏移量,在这种情况下是1,意味着它加载'B'('u')之后的字节。 'u'的ASCII值是117,这就是打印的内容。这不正确吗?
对于“Bush”的前五个字符继续(记住,字符串已经以0值终止,并且正确的值似乎被打印出来),所以你告诉我们它有什么问题。
您的Length
例程存在错误,因为第一个字符不是来自User
,而是来自Length
。改变顺序如下:
addi $t1,$t1,1
lb $a0,User($t1)
beq $a0,0,End
j Length
至于字母表的内容,请提出一个单独的问题并提供问题的详细信息:你尝试了什么,它做了什么,应该做什么,等等。
答案 1 :(得分:0)
$ s1是ascii值
显示寄存器$ s1
中的字符li $v0, 11 #print character move $a0, $s1 syscall
示例:$ s1 =“0”= 0x30 = 48结果:0 显示从寄存器$ s1到十进制
的ascii值li $v0, 1
move $a0, $s1
syscall
示例:$ s1 =“0”= 0x30 = 48结果:48