0

我正在尝试制作一个可以显示字符的 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 值的程序时,我会遇到运行时错误。如果有人能帮助我解决这个问题,那对我来说将是一件大事。

问候

4

2 回答 2

2

你期望它做什么,它目前做什么?这是我的输出:

66
117
115
104
0
4

如果要显示实际的字母,请使用向量 11 而不是 1 syscall,这是打印字符向量

B
u
s
h

4

lb $a0,User($0)
li $v0,1
syscall

这会从 的地址加载一个字节User并将其放入$a0. 然后,它将该值打印为 integer。atUser的值是 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

至于字母表的东西,请提出一个单独的问题并提供足够的问题细节:你尝试了什么,它做了什么,它应该做什么,诸如此类。

于 2012-10-04T01:08:24.393 回答
2

$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

于 2016-02-09T17:26:48.957 回答