2012-10-03 68 views
0

我想制作一个程序,在其中可以显示字符的ascii值。问题是它不显示真正的ascii值。我在MIPS汇编中制作这个代码非常类似于普通的汇编语言。这里是代码:显示字符的Ascii值

.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值的程序时,我会得到运行时错误。如果有人能够帮助我,这对我来说很重要。

Regards

回答

0

你期待它做什么,它目前做了什么?下面是输出对我来说:

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,这就是打印的内容。这是不正确的?

对于“布什”的前五个字符(请记住,字符串已用零值终止为零),并且正确的值似乎已打印出来,所以您告诉我们它有什么问题。

您的Length例程存在一个错误,因为第一个字符不是User,而是Length。更改排序为这样:

addi $t1,$t1,1 
lb $a0,User($t1) 
beq $a0,0,End 
j Length 

至于字母的东西,请做一个单独的问题,并提供问题的足够的细节:你尝试过什么,这是什么做的,什么是它应该做那样的事情。

0

$ s1为ASCII值

显示来自寄存器$ s1的字符

li $v0, 11  #print character 
    move $a0, $s1 
    syscall 

例如:$ S1 = “0”=的0x30 = 48结果:0 显示的ASCII从寄存器$ s1到十进制的值

li $v0, 1 
move $a0, $s1 
syscall 

示例:$ s1 =“0”= 0x30 = 48结果:48

+0

请改善您的格式 - 所有内容格式化为代码,但看起来不像代码。 “显示寄存器$ s1中的字符” – Alexander