Assembly 如何使用汇编语言一次从用户处获取一个字符?

Assembly 如何使用汇编语言一次从用户处获取一个字符?,assembly,character,mips,Assembly,Character,Mips,我花了好几个小时才弄明白。我应该让用户输入一个字符串和两个字符,然后程序应该用第二个字符替换第一个字符的任何实例 范例 输入字符串:string 输入一个字符:t 输入另一个字符:p 你的新词是:春天 以下是我迄今为止的代码(汇编语言): .data userStr:。空间为50 ch1:。空间1 ch2:。空间1 str:.asciiz“请输入字符串:” 字符1:.asciiz“\n输入字符:” 字符2:.asciiz“\n输入替换字符:” 结果1:.asciiz“\n原始字符串:” 结果

我花了好几个小时才弄明白。我应该让用户输入一个字符串和两个字符,然后程序应该用第二个字符替换第一个字符的任何实例


范例

输入字符串:string

输入一个字符:t

输入另一个字符:p

你的新词是:春天


以下是我迄今为止的代码(汇编语言):

.data
userStr:。空间为50
ch1:。空间1
ch2:。空间1
str:.asciiz“请输入字符串:”
字符1:.asciiz“\n输入字符:”
字符2:.asciiz“\n输入替换字符:”
结果1:.asciiz“\n原始字符串:”
结果2:.asciiz“\n结果字符串:”
结果3:。asciiz“替换”
结果4:“asciiz”->”
测试仪:.asciiz“\n字符为:”
tester2:.asciiz“\n字符2是:”
.文本
格洛博梅因酒店
主要内容:
la$a0,str#提示输入字符串
李$v0,4
系统调用
la$a0,userStr#输入字符串存储在“userStr”中
李$v0,8
syscall#调用操作系统
李$v0,4
la$a0,字符1#打印输入字符的提示
系统调用
la$a0,ch1#将字符存储为ch1
李$v0,8
syscall#调用操作系统
李$v0,4
la$a0,字符2#打印输入字符的提示
系统调用
la$a0,ch1#将第二个字符存储为ch2
李$v0,8
系统调用
la$a0,测试仪#打印“字符为:”
李$v0,4
系统调用
la$a0,ch1#打印
李$v0,4
系统调用
la$a0,测试人员2#打印“字符是:”
李$v0,4
系统调用
la$a0,ch2#打印
李$v0,4
系统调用
li$t1,0#$t1是原始字符串的索引
李$t2,0#$t2是柜台
#磅$t3,ch1#$t3持有char1
#磅$t4,ch2#$t4持有char2
la$a0,用户打印
李$v0,4
系统调用
la$a0,测试仪#打印“字符为:”
李$v0,4
系统调用
la$a0,ch1#打印
李$v0,4
系统调用
循环:lb$t0,userStr($t1)#$t0保存字符串中的特定字符
beqz$t0,结果#检查字符串结尾(null)
bne$t0,$t3,inc#在字符串索引处比较char1和char;增加索引而不考虑匹配
移动$t0,$t4#如果两个字符都匹配,则用字符2替换字符1
inc:加上$t1,$t1,1#还有,索引+1
j循环#再次循环

(我在PCSPIM上运行这个程序。我对汇编语言非常陌生。我通常用C或Java编程)


结果显示,我的第一个字符是p,没有第二个字符。但原始字符串不受影响。我现在正在将字符编程为字符串,因为我认为这可能会有所帮助,但事实并非如此。在此方面的任何帮助都将不胜感激

下面是一个如何做到这一点的示例

.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
请注意,我使用的是延迟分支。

不进行组装。结果如何?你没有声明这个符号。我也可以建议火星作为SPIM更好的替代品。
.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