私は現在、ci20マシン上の小さなプログラムで作業しており、ユーザに整数値を入力させ、画面に値を表示します。アセンブリのci20 segフォルトでユーザ入力を促す
私の現在のコード
.data
prompt:
.asciiz "Please enter an integer: "
message:
.asciiz "\nValue entered: "
.text
.global main
main:
addiu $sp, $sp, -4 # push stack
sw $ra, ($sp) # save return address
addi $v0, $0, 4
la $a0, prompt
syscall # printing prompt
addi $v0, $0, 5
syscall # get user input
move $t0, $v0 # save input in $t0
move $a0, $v0
addi $v0, $0, 1 # Not sure if this is right to print message
la $a0, message # Not sure if this is right to print message
syscall
lw $ra, ($sp) # restoring $sp
addiu $sp, $sp, +4 # release the stack space used for $sp
私はワンセグ障害を取得し、プログラムを実行しようとする理由がわかりません。どんな助けや提案も大歓迎です。
Linuxの読み込み/書き込みシステムコールは、ファイル記述子(例えば、標準入力の場合は0、標準出力の場合は1)、バッファアドレスとバイト数を取る必要があります。 –
応答@ Ped7gありがとうございました。私はgdbを実行しているLinuxベースのマシンであるci20マシンでプログラムを実行しています。私がgdbデバッガを使って実行すると、seg faultが発生しないため、なぜseg faultであるのかという混乱が生じます。 – TurtleMan
@TurtleManの場合、引数はsegfaultには十分な毒性はありませんが、linuxではなくsyscallにMARS引数を使用しています。ウェブ上で簡単に見れば、これはコンソールに何かを出力すると思います: '' v0' = '4'(sys_write)、' a0' = '1'(ファイル記述子stdout)、' a1' = 'prompt' .ascii文字列)、 'a2' =' 25'(.ascii文字列の長さ) 'syscall'です。これを最初の短いコードで試してみてください。ああ、 'v0' =' 1'はsys_exitです(終了コードに 'a0'という値があります)。おそらく、最初のものとしてa0 = 123と 'echo $?'をテストして、終了コードが123であるかどうかを調べるでしょう。 – Ped7g