显示字符的Ascii值

时间:2012-10-03 11:01:41

标签: assembly character ascii mips

我正在尝试创建一个可以显示字符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值的程序时,我会遇到运行时错误。如果有人可以帮我这个,那将对我很有帮助。

此致

2 个答案:

答案 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