-2

基数を入力した後の 2 番目の値を入力すると、不明な出力エラーが発生します。

うまくいけば、私のエラーを特定できる人もいます:

エラー: 命令は 0x00400060 [0x00400060] で未定義のシンボルを参照しています 0x102a0000 beq $1, $10, 0 [hex-0x0040005c]

PROGRESS: 現在、ステップ 2 で止まっています。

私がやりたいことは、

1) ユーザーは 10 進数値を入力します

2) ユーザーが変換のタイプを入力

3) 先に選択した変換のタイプに応じて、目的のサブルーチンに移動します

4)表示出力

.data 
prompt: .asciiz "Enter the decimal number to convert: "
base: .asciiz "Select type of base (2 for binary,16 for hexadecimal or 8 for octal): " 
ans1: .asciiz "\nBinary Output is equivalent:"
ans2: .asciiz "\nOctal Output is equivalent:"
ans3: .asciiz "\nHexadecimal Output equivalent:0x" 
result1: .space 8 
.text 
.globl main 
main: 

la $a0, prompt #Display message
li $v0, 4 
syscall
li $v0, 5 
syscall
beq $v0, $zero, Exit #Exit if 0 decimal is entered 
move $t0, $v0   #Else copy value entered into temporaries

askbase:

li $v0, 4
la $a0, base #Display message
syscall
li $v0, 5
syscall
add $t1,$zero,$v0   #Add desired value/base entered into t1

beq $t2,16,hex #if base 16 is entered,goto hex subroutine
beq $t2,8,oct
beq $t2,2,bin

la $a0, ans3 
li $v0, 4 
syscall 
li $t0, 8   # counter 
la $t3, result1 # where answer will be stored 

Hex: 

beqz $t0, Exit  # branch to exit if counter is equal to zero 
rol $t2, $t2, 4 # rotate 4 bits to the left 
and $t4, $t2, 0xf   # mask with 1111 
ble $t4, 9, Sum # if less than or equal to nine, branch to sum 
addi $t4, $t4, 55   # if greater than nine, add 55 

b End 

Sum: 
addi $t4, $t4, 48   # add 48 to result 

End: 
sb $t4, 0($t3)  # store hex digit into result 
addi $t3, $t3, 1    # increment address counter 
addi $t0, $t0, -1   # decrement loop counter 
j Loop 

Exit: la $a0, result1 
li $v0, 4 
syscall 
la $v0, 10 
syscall
4

2 に答える 2

0

29行目にタイプミスがあるようbeq $t2,16,hexですbeq $t2,16,Hex. の大文字に注意してくださいHex。また、いくつかの未定義のラベルがあります: Loop、oct、bin... これらのラベルがないと、問題が発生します。一部をプレースホルダーとして設定することをお勧めします (サブルーチンが定義されるまで)。たぶん、それらすべてを に分岐させExit:ます。アセンブラは、実際のラベルがないと分岐命令を解決できません。

于 2014-08-07T16:17:38.850 に答える
0

には何も格納していないので、 16 になると$t7予想する特別な理由はありません。$t7

おそらく書きたかったのは次のとおりです。

beq $t1,16,hex

以来$t1、ベースを格納したレジスタです。

ただし、現在のコードの構造でなぜそのジャンプが必要なのか、私には本当にわかりません。サブルーチンは、特定の値に初期化されているいくつかのレジスタ (および など) にhex依存しており、その初期化が行われた場合、その初期化はスキップされます。$t0$t3beq

于 2014-08-07T17:10:55.653 に答える