#assembly #character #mips
#сборка #символ #mips
Вопрос:
Я работаю над этим часами и никак не могу в этом разобраться. Предполагается, что пользователь вводит строку и два символа, затем программа должна заменить любой экземпляр первого символа вторым..
ПРИМЕР
Введите строку: String
Введите символ: t
Введите другой символ: p
Ваше новое слово: Spring
Вот мой код на данный момент (на языке ассемблера):
.data
userStr: .space 50
ch1: .space 1
ch2: .space 1
str: .asciiz "Please enter a string: "
char1: .asciiz "nEnter a character: "
char2: .asciiz "nEnter a replacement character: "
result1: .asciiz "nOriginal String: "
result2: .asciiz "nResult String: "
result3: .asciiz " Substitute "
result4: .asciiz " --> "
tester: .asciiz "nCharacter is: "
tester2: .asciiz "nCharacter 2 is: "
.text
.globl main
main:
la $a0, str # Prompt to enter a string
li $v0, 4
syscall
la $a0, userStr # input string is stored in 'userStr'
li $v0, 8
syscall # Calls the operating system
li $v0, 4
la $a0, char1 # Prints prompt to enter a character
syscall
la $a0, ch1 # Stores character as ch1
li $v0, 8
syscall # Calls the operating system
li $v0, 4
la $a0, char2 # Prints prompt to enter a character
syscall
la $a0, ch1 # Stores second character as ch2
li $v0, 8
syscall
la $a0, tester # print "Character is: "
li $v0, 4
syscall
la $a0,ch1 # print <character>
li $v0, 4
syscall
la $a0, tester2 # print "Character is: "
li $v0, 4
syscall
la $a0,ch2 # print <character>
li $v0, 4
syscall
li $t1,0 # $t1 is the index of the original string
li $t2,0 # $t2 is the counter
#lb $t3,ch1 # $t3 holds char1
#lb $t4,ch2 # $t4 holds char2
la $a0, userStr # print <original string>
li $v0, 4
syscall
la $a0, tester # print "Character is: "
li $v0, 4
syscall
la $a0,ch1 # print <character>
li $v0, 4
syscall
loop: lb $t0, userStr($t1) # $t0 holds the specific char from the string
beqz $t0,results # checks for end of string (null)
bne $t0,$t3,inc # compares char1 to char at index of string; increments index regardless of match
move $t0, $t4 # if both chars match, replace char1 with char2
inc: add $t1,$t1,1 # also, index 1
j loop # loop again
(Я запускаю это на PCSPIM . Я очень новичок в языке ассемблера. Обычно я программирую на C или Java)
Результаты говорят, что мой первый символ — p и что у меня нет второго символа. Однако на исходную строку это не влияет. Пока я программирую символы в виде строк, потому что думал, что это может помочь, но этого не произошло. Любая помощь по этому вопросу была бы очень признательна!
Комментарии:
1. Не выполняется сборка. Каковы результаты ? Вы не объявили этот символ. Также могу я предложить MARS в качестве лучшей альтернативы SPIM.
Ответ №1:
Вот пример того, как это сделать.
.text
# Read string
li $v0, 8
la $a0, str_input
li $a1, 50
syscall
# Read char1
jal readchar
nop
# Store char1 in $s0
or $s0, $v0, $zero
# Read char2
jal readchar
nop
# Store char2 in $s1
or $s1, $v0, $zero
# Call str_replace
la $a0, str_input
or $a1, $s0, $zero
jal str_replace
or $a2, $s1, $zero
# Print string result
li $v0, 4
la $a0, str_input
syscall
###########################################
readchar:
# Read char from input, returns char on $v0
li $v0, 12
syscall
jr $ra
nop
###########################################
###########################################
str_replace:
# Replaces one char with another in a string
# $a0 -> string buffer to be manipulated
# $a1 -> char to be replaced
# $a2 -> char to replace with
or $t0, $a0, $zero # $t0 -> pointer to char
str_replace_loop:
lb $t1, 0($t0) # $t1 -> current char
beq $t1, $zero, str_replace_exit # Is end of string?
nop
bne $t1, $a1, str_replace_next # Is char to replace?
nop
sb $a2, 0($t0)
str_replace_next:
addiu $t0, $t0, 1
b str_replace_loop
nop
str_replace_exit:
jr $ra
nop
###########################################
exit:
li $v0, 10
syscall
.data
str_input: .byte 50
Обратите внимание, что я использую отложенное ветвление.