MIPS のランタイム スタックを使用して括弧付きの数学の問題を計算する必要がある宿題をしていて、ちょっとした問題にぶつかりました。
ユーザーが提供した入力から整数を解析しようとしているところまで来ました。1 桁のみを処理するときは非常にうまく機能しましたが、2 桁の数字になると問題が発生しました (Syscall 4 または print string 関数を使用していました)。たとえば、77 を打つと、「H」になります。そこで、syscall を print integer コマンドの 1 に切り替えたところ、非常に大きな数値が得られました。私がする必要があることを達成できる方法はありますか?
これまでの私のコード。加算および減算メソッドは無視してください。まだ実装されていません。この問題を解決した後は、導入が非常に簡単になるはずです。
.data
Welcome: .asciiz "\nCalculate a Fully Parenthesized Expression.\n"
promptExpr: .asciiz "Enter the expression: "
bufExpr: .space 200
.text
.globl main
main:
la $a0, Welcome
li $v0, 4
syscall
la $a0, promptExpr
li $v0, 4
syscall
li $v0, 8
la $a0, bufExpr
li $a1, 200
syscall
li $t0, 0
subu $sp, $sp, 4
sw $t0, ($sp)
li $t1, 0
Loop: lb $t0, bufExpr($t1)
beq $t0, 10, endProg
beq $t0, 45, negCheck
bgt $t0, 47, num
beq $t0, 41, calc
bne $t0, 32, push
addi $t1, $t1, 1
j Loop
endProg:
li $t1, 0
la $a0, ($sp)
li $v0, 1
syscall
li $v0, 10
syscall
num:
move $t2, $t0
addi $t1, $t1, 1
lb $t0, bufExpr($t1)
bgt $t0, 47, collect
subu $sp, $sp, 4
sw $t2, ($sp)
addu $t1, $t1, 1
j Loop
collect:
# collects the entire integer by multiplying the current amount by ten
# and adding the next digit.
li $t7, 10
mul $t2, $t2, $t7
addu $t2, $t2, $t0
addi $t1, $t1, 1
lb $t0, bufExpr($t1)
bgt $t0, 47, collect
subu $sp, $sp, 4
sw $t2, ($sp)
j Loop
push:
subu $sp, $sp, 4
sw $t0, ($sp)
addu $t1, $t1, 1
j Loop
negCheck:
calc:
lw $t4, ($sp)
addu $sp, $sp, 4
lw $t5, ($sp)
addu $sp, $sp, 4
move $t0, $t4
beq $t5, 40, push
lw $t6, ($sp)
addu $sp, $sp, 4
lw $t7, ($sp)
addu $sp, $sp, 4
beq $t5, 43, addMath
beq $t5, 45, subMath
addMath:
subMath:
コードがごちゃごちゃしていて申し訳ありません。MIPS は頭痛の種です。
前もって感謝します!