0

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 は頭痛の種です。

前もって感謝します!

4

1 に答える 1

0

入力文字列の文字を range の値に変換するには、 /ルーチンで'0'(10 進数48)を減算する必要があります。numcollect0..9

それ以外の場合12、プロンプトで文字列を入力すると'1' * 10 + '2'、つまり49 * 10 + 50(= 540) が表示されます。

于 2013-04-30T11:24:13.273 に答える