【问题标题】:Displaying Ascii values of characters显示字符的 Ascii 值
【发布时间】:2012-10-03 11:01:40
【问题描述】:

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

问候

【问题讨论】:

  • 与普通汇编语言非常相似的 MIPS 汇编:嗯?每个体系结构都有自己的汇编语言,或者有时对于相同的二进制机器代码有不止一种 asm 语法。这个 MIPS asm 语法普通的 MIPS 汇编语言。
  • 因缺少 minimal reproducible example 而被否决。正如 Jeff 的回答所说,这确实运行并将预期的 ASCII 代码显示为整数值asciitable.com,以十进制表示。如果“此外”部分是您真正的问题,那么那绝对不是 MCVE。

标签: assembly character ascii mips


【解决方案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

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

【讨论】:

    【解决方案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

    【讨论】:

    • 请改进您的格式 - 一切都被格式化为代码,但它看起来不像代码,例如"显示寄存器 $s1 中的字符"
    猜你喜欢
    • 1970-01-01
    • 2022-01-14
    • 2011-01-12
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多