【问题标题】:MIPS Assembly wrong digitMIPS 汇编错误的数字
【发布时间】:2020-01-03 16:30:55
【问题描述】:
la $a0, number
li $t3, 0     #Iterator = 0
li $v1, 0     #Sum = 0

while:
add $t1, $a0, $t3   #t1 = &A[i]

lb $t1, 0($t1)      # A[i]

beq $t1, $zero, endwhile

add $v1, $v1, $t1       # Sum

addi $t3, $t3, 1        # Iterator + 1

subi $v1, $v1, 48       # ???? Every digit is added with 48, so i have to subtract but why ???

j while
endwhile:

li $v0, 1       #Print the sum
move $a0, $v1 
syscall 

有人可以帮助我吗?为什么我必须用 48 减去每个数字才能得到正确的结果? 我不知道为什么它每次都会将 48 添加到我的字符串中的数字。 例如,我有字符串:“1234”,如果我不用 48 减去每个数字,结果是 202。每个数字减去 48,正确的结果是 10。

【问题讨论】:

  • 是的,您需要从每个数字中减去 48。请咨询ascii table。可以看到字符0-9对应的代码是48-57。
  • 哦,谢谢..我不知道

标签: assembly mips


【解决方案1】:

看起来,给定一个数字作为字符串(比如“1234”),您正试图获得所有数字的总和。 “1234”字符串在 MIPS 内存中存储为以下 5 个字节 - 49, 50, 51, 52, 0

第 0 个字节 - 十进制 49(ASCII 为 1)
第一个字节 - 十进制 50(2 的 ASCII).. 等等
第 n 个字节 - 十进制 0(空字符的 ASCII - 表示 MIPS 字符串的结尾)

从您的代码中考虑这一行 -

lb $t1, 0($t1)      # A[i]

这会加载 A[i] 处的字节值。在第一次迭代中,它存储 49('1' 的 ASCII),不是'1'本身。

现在要从它的 ASCII 值中获取数字本身,我们需要从中减去 '0' 的 ASCII。

即数字 d 的 ASCII - 0 的 ASCII = d 的数值(考虑一下)。
现在 0 的 ASCII 是 48。这就是你要减去的。

在没有它的情况下,你最终将 1、2、3、4 的 ASCII 值相加,即 49+50+51+52 = 202

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-26
    • 2017-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多