【问题标题】:MIPS Code For conversion of string of characters to base 10 from base 33MIPS 代码用于将字符串从基数 33 转换为基数 10
【发布时间】:2018-11-12 15:57:49
【问题描述】:

我有这个任务,它必须完成以下所有工作:

我必须:编写一个 MIPS 程序,从用户输入中读取最多 4 个字符的字符串。程序必须使用循环处理用户输入。该程序不得有子程序。然后,假设用户输入以 33 为基数。将其转换为十进制整数。请帮我。我的代码中有错误。另外,我不知道如何将字符串转换为整数,然后再转换为基数 10。我以为我做得对,但现在很困惑。

我写了我的代码,但它似乎不起作用。

这是我的代码:

.data
Ask:

.asciiz "\n Please Enter 4 Characters\n" 

userInput:  .space 20

Answer:

.asciiz "\n You Entered : \n"

.text 

main:
#addi $t0, 0


li $v0, 4
la $a0, Ask #display question
syscall

li $v0, 8 #get input
la $a0, userInput
li $a1, 20
syscall

li $v0, 4
la $a0, Answer
syscall

li $v0, 4
la $a0, userInput
syscall

lb $s1, 1($a0)  #last digit
lb $s2 2($a0)   #third
lb $s3 3($a0)   #second digit
lb $s4, 4($a0)  #first digit
lb $t0, 0($a0) #checks for \n

addi $t1, $zero, 10 #takes in \n
addi $t7, $zero, 33   #gets value to multiply
addi $s0, $zero, 1089  #gets 33^2
addi $t5, $zero, 97  #gets 64, smaller than ascii code for 'A'
addi $t6, $zero 96  #gets 96, smaller than ascii code for 'a'
addi $t2, $zero, 65  #loads 47 into $t2, smaller than the ascii code for '0'
#addi $t3, $zero,  55


beq $t0, $t1, Label1

Label1:

blt $s1, $t2, L1
blt $s1, $t5, L2
bgt $s1, $t6, L3

L1: 
    addi $s1, $s1, -48  #subtracts 48 from $s1 which is 48 to get int  from 0 to 9 
L2: 
    addi $s1, $s1, -55 #gets values from 10 to 33
L3: 
    addi $s1, $s1, -87  #gets values from 10 to 33 for small caps

blt $s2, $t2, L4
blt $s2, $t5, L5
bge $s2, $t6, L6

L4: 
    addi $s2, $s2, -48
L5: 
    addi $s2, $s2, -55
L6: 
    addi $s2, $s2, -87

blt $s3, $t2, L7
blt $s3, $t5, L8 
bgt $s3, $t6, L9

L7: addi $s3, $s3, -48
L8: addi $s3, $s3, -55
L9: addi $s3, $s3, -87


blt $s4, $t2, L10
blt $s4, $t5, L11
bgt $s4, $t6, L12

L10: 
    addi $s4, $s4, -48
L11: 
    addi $s4, $s4, -55
L12: 
    addi $s4, $s4 , -87

syscall


add $s5, $zero, 0
add $s5,$s5, $s1
mult $s2, $t7
mflo $s2
add $s5, $s5, $s2
mult $s3, $s0
mflo $s3
add $s5, $s5, $s3
mult $s0, $t7
mflo $s0
mult $s4, $s0
mflo $s4
mfhi $s0
add $s5, $s5, $s4
add $s5, $s5, $s0
syscall

#li $v0, 1
#la $a0, $s5

#la $v0, 4 
#lw $a0, s4

#last system call of the program will be very last instruction
li $v0, 10
syscall  

【问题讨论】:

  • “我的代码出现错误。”“它似乎不起作用。” 不是很好的问题描述。究竟是什么错误,它们究竟发生在哪里?此外,代码似乎针对的是 SPIM 或 MARS 等模拟器,它们内置了相当不错的调试功能(例如单步执行、断点、寄存器/内存查看器)。您在分析代码的运行时行为方面做了哪些工作?
  • 好的。所以基本上,这不是 mips 的错误。我的意思是,如果我尝试将 12AB 转换为基数 33,它就不起作用。它只是保持在12AB。另外,我不确定字符串到 int 的转换是否真的有效。你能帮忙吗?
  • 好的。然后使用模拟器单步执行转换代码,验证每一步的结果是否符合您的预期。
  • 我试过这样做,但我使用的是 QTSimp,我认为它没有那个功能。你能告诉我如何修复/改进我的代码吗?
  • 当然可以。可以在代码窗口中右键设置断点,F10键可以单步执行。

标签: string mips base review


【解决方案1】:

对于初学者:

lb $s1, 1($a0)  #last digit
lb $s2 2($a0)   #third
lb $s3 3($a0)   #second digit
lb $s4, 4($a0)  #first digit
lb $t0, 0($a0) #checks for \n

a0 中有一个 4 个字符的字符串 - 假设它是 ABCD 类型

所以:

0($a0) will be A
1($a0) will be B
2($a0) will be C
3($a0) will be D

接下来假设 s1 是 'A'

Label1:

blt $s1, $t2, L1  # 65
blt $s1, $t5, L2  # 97 
bgt $s1, $t6, L3  # 96


L1: 
    addi $s1, $s1, -48  #subtracts 48 from $s1 which is 48 to get int  from 0 to 9 
L2: 
    addi $s1, $s1, -55 #gets values from 10 to 33
L3: 
    addi $s1, $s1, -87  #gets values from 10 to 33 for small caps

'A' 是 65 所以会跳到 L2,减去 -55 所以不是 10,然后落入 L3 并减去 87 得到 -77。

如果是 '9' (57) 而不是 'A',它将转到 L1,减去 48,下降到 L2,减去 55,下降到 L3,减去 87。

所以对于每个字母,检查一下,应该会出现类似这样的情况:

 L1: 
    addi $s1, $s1, -48  #subtracts 48 from $s1 which is 48 to get int  from 0 to 9 

    j  DoneL13
 L2: 

    addi $s1, $s1, -55 #gets values from 10 to 33
    j  DoneL13
 L3: 
    addi $s1, $s1, -87  #gets values from 10 to 33 for small caps

 DoneL13:

最后你有一些 sys 调用 - 不知道它们是什么意思,但我猜它神奇地意味着知道你想在 s5 中打印值?

【讨论】:

  • 是的,我打算在转换为基数 10 后打印它。感谢您的帮助。我仍然对为什么我的转换不正确感到有些困惑。
  • 你能告诉我如何解决它吗?
  • 至少您需要更新 L1-L3 语句以不相互运行,即:L1 应该做 L1 的事情,而不是做 L2 等。
猜你喜欢
  • 2010-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-27
  • 1970-01-01
  • 2021-03-09
  • 2016-01-13
  • 2018-02-25
相关资源
最近更新 更多