Xóa ký tự trong chuỗi MIPs

Chào mọi người, em đang làm 1 bài kiến trúc máy tính.
Đề bài thế này: nhập một chuỗi, và một ký tự, in ra chuỗi đã được xóa.
Ví dụ:
nhập chuỗi: daihoc
nhập ký tự: a
output: chuỗi sau khi xóa ký tự: dihoc

nhập chuỗi: congnghe
nhập ký tự: k
output: Ketqua: k khong co trong chuoi

Ý tưởng để làm bài này là cho duyệt hết các ký tự trong chuỗi, nếu nó 2 ký tự bằng nhau thì bỏ qua, nếu nó không bằng nhau thì lưu nó vào output_str.
Sau khi duyệt xong, nếu có ký tự trùng thì in ra output_str. Nếu không có thì in chuỗi “Ketqua: …”
Em gặp vấn đề khi dùng hàm sb, em đã store lại vào mảng output_str rồi nhưng khi in thì nó không hiện ra. Không biết em có hỏng kiến thức chỗ nào không, mọi người xem và chỉ giúp em với ạ. Em xin cảm ơn nhiều. Đây là code của em:

.data
str_input: .space 16
str_output: .space 16
nhap_chuoi: .asciiz"Nhap vao mot chuoi: "
nhap_ky_tu: .asciiz"\nNhap vao mot ky tu: "
contain_true: .asciiz"\nChuoi sau khi xoa ky tu: "
part_contain_false_1: .asciiz"\nKet qua: "
part_contain_false_2: .asciiz" khong co trong chuoi"
.text
main:
la $a0, nhap_chuoi
li $v0, 4
syscall

la $a0, str_input
li $a1, 16
move $s0, $a0 # s0: address of input string
li $v0, 8
syscall

la $a0, nhap_ky_tu
li $v0, 4
syscall

li $v0, 12
syscall
move $t0, $v0 # $t0: character

la $s1, str_output # $s1: address of output string
li $t1, 0 # $t1 = i: iteration of input string, starting at 0
li $t2, 0 # $t2 = j: iteration of output string, starting at 0
li $t3, 0 # if $t3 = 1 input string contain character, otherwise it doesn't contain

loop:
add $s2, $s0, $t1 # s2: address of input_str[i]
lb $s3, 0($s2) # s3: current character
beq $s3, $zero, exit #exit loop if it reach the end of input string
bne $s3, $t0, true # compare 2 character
false:
li $t3, 1
j continue_loop
true:
add $s4, $s1, $t2 # s4: address of output_str[j]
sb $s3, 0($s4)
addi $s2, $s2, 1

continue_loop:
addi $t1, $t1, 1
j loop

exit:
beq $t3, $zero, print_not_contained
print_contained:
la $a0, contain_true
li $v0, 4
syscall

la $a0, str_output
li $v0, 4
syscall
j end

print_not_contained:
la $a0, part_contain_false_1
li $v0, 4
syscall

move $a0, $t0
li $v0, 11
syscall

la $a0, part_contain_false_2
li $v0, 4
syscall

end:
li $v0, 10
syscall

Có cả simulator như vậy thì bạn thử chạy step by step để thử xem. Nhớ kiểm tra kỹ từng chỗ input data đã lưu đúng chưa, output str có lưu đúng chưa trước đã nhé.

Spoiler: Chỉ đọc khi bạn chạy debug mà vẫn bí
Hãy chắc chắn là bạn đã chạy step by step

Chú ý đoạn code trong true:

6 Likes

Em cũng có debug thử, nhưng mà cái output_str nó chỉ lưu địa chỉ của buffer, em không biết kiểm tra giá trị của buffer chỗ nào nữa.


Bên tab execute có 2 dòng này, thì chỗ Data Segment bên /me output_str sẽ ở khoảng 0x10010010
Còn không thì cứ dùng chuỗi nào đặc biệt chút abcde rồi ký tự là c chẳng hạn, rồi nhìn dưới Data segment xem có chỗ nào hiện ra 61 (là mã hex ASCII của ký tự a)

6 Likes

Wow, cảm ơn anh, để em debug thử, đó giờ em không debug bên này :grin:

Ủa, sao nó lại ghi đè lên luôn mà nó không thêm vào phía sau nhỉ :v
Ola, tại vị em cộng sai cái thanh ghi.
Phải là:

addi $t1, $t1, 1 

mới đúng.
Cảm ơn anh nhiều lắm. :))))

4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?