簡體   English   中英

MIPS 程序集錯誤的數字

[英]MIPS Assembly wrong digit

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。

看起來,給定一個字符串形式的數字(比如“1234”),您正在嘗試獲得所有數字的總和。 “1234”字符串在 MIPS 內存中存儲為以下 5 個字節 - 49, 50, 51, 52, 0

第 0 個字節 - 十進制 49(ASCII 為 1)
第一個字節 - 十進制 50(ASCII 為 2)...等。
第 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM