一度に1文字のユーザー入力を受け取り、再帰を使用してアルファベット順の文字列に挿入するプログラムをアセンブリで作成しています。私はこれを長い間見つめてきましたが、それでもうまくいくようです。これに関するいくつかの他の目は大歓迎です。
.data
text1: .asciiz "To begin, type a lower case letter.\n"
text2: .asciiz "Any time you are prompted for an input, you may type a 'P' to print the alphabetized string.\n"
text3: .asciiz "You can also type 'Q' to end the program.\n\n"
text4: .asciiz "Input: "
text5: .asciiz "End."
err: .asciiz "Something broke\n"
str: .asciiz "abcdefghijklmnopqrstuvwxyz"
buffer: .space 30
in: .space 4
.text
main: la $a0, text1 #opening statements
li $v0, 4
syscall
la $a0, text2
syscall
la $a0, text3
syscall
input: la $a0, text4
li $v0, 4
syscall
li $v0, 12 #get input character
syscall
move $t0, $v0
li $a0, 0x0a #print new line
li $v0, 11
syscall
beq $t0, 0x50, print #input is 'P'; print out string
beq $t0, 0x51, end #input is 'Q'; end
la $t1, str
search: lb $t2, 0($t1) #search for the starting location
beqz $t2, error
beq $t2, $t0, phase1
addi $t1, $t1, 1
j search
phase1: sw $t2, ($sp) #store the letter on the stack
sub $sp, $sp, 4
sw $t1, ($sp) #store address of the letter on the stack
sub $sp, $sp, 4
addi $t1, $t1, 1 #increment address
lb $t2, 0($t1) #getting next letter to prepare for next loop
beqz $t2, phase2 #if end of string is reached, come out of loop
jal phase1
j input
phase2: lw $ra, ($sp) #pull return location off stack
addi $sp, $sp, 4
lw $t3, ($sp) #pull letter address off stack
addi $sp, $sp 4
lw $t4, ($sp) #pull letter off stack
addi $sp, $sp, 4
addi $t3, $t3, 1 #increment old address to get new address
sw $t4, 0($t3) #store the letter in its new location
jr $ra
error: la $a0, err
li $v0, 4
syscall
j input
print: la $a0, str
li $v0, 4
syscall
li $a0, 0x0a
li $v0, 11
syscall
j input
end: la $a0, text5
li $v0, 4
syscall
li $v0, 10
syscall
具体的には、次の行でエラーが発生しています。
sw $t4, 0($t3)
「ストア内のアライメントされていないアドレス: 0x100100e7」と表示されます
その後、「例外 5 [ストア内のアドレス エラー] が発生し、無視されました」と表示されます。
続いて、「例外 6 [不正な命令アドレス] が発生し、無視されました」という終わりのないチェーンが続きます。
QtSpim を使用しています。