Программа Mips не печатает правильную строку - PullRequest
0 голосов
/ 03 декабря 2018

Я создаю программу для преобразования римских цифр.Я ввожу буквы (римские цифры), и на выходе должно быть соответствующее целое число.Когда я ввожу римскую цифру, она говорит, что число равно 0 независимо от того, какое это число.Я думаю, что он пропускает функцию rom и просто печатает что-то напрямую, но я не могу понять, почему он это делает.

  #Program to convert Roman numerals
  #Written by Naomi Gebremariam

  .data
  .align    2 
fprompt: .asciiz "Enter a Roman number: "
fanswer: .asciiz " The arabic notation of the roman numeral you entered is = \n"
  #----------------------------------Usual stuff at beginning of main---------------------------------------------------
  .text
  .globl main

  #takes the user input and puts it into registers, makes a call to check then prints result
main:               

  #get roman numeral inpuut from user

  li $s1,'I'     #load I into s0
  li $s2,'V'             
  li $s3,'X' 
  li $s4,'L'
  li $s5,'C'
  li $s6,'D'
  li $s7,'M'

  la $a0,fprompt
  li $v0,4
  syscall
  li $v0,51
  syscall

  jal rom

  #a0 has n (romnum)


  #print result   
  move $v0,$t1
  la $a0,fanswer         
  li $v0,1       
  syscall            
  li $v0,10          
  syscall   

  #have to store these so that the sequence can be calculated


  #-------------------------Function to check how many symbols are entered---------------------------------------


rom:     
  addi $sp, $sp, -8 #allocate stack space
  sw $ra, 0($sp) #store return address
  sw $s0, 4($sp)
  #------------function body--------------------------      

  #load roman numerals into registers for comparison
  move $s0,$v0
  beq $s1,$s0,one
  beq $s2,$a0,five
  beq $s3,$s0,ten 
  beq $s4,$s0,fifty
  beq $s5,$s0,hundred
  beq $s6,$s0,fivehun
  beq $s7,$s0,thousand


one:  
  li $t1,1

five:
  li $t1,5
  jr $ra

ten: 
  li $t1,10 #load 10 into result
  jr $ra

fifty:
  li $t1,50
  jr $ra

hundred:
  li $t1,100

fivehun: 
  li $t0,500

thousand:
  li $t1,1000

done:          
  lw $ra, 0($sp)
  lw $s0, 4($sp)
  addi $sp, $sp, 8 
  jr $ra 

1 Ответ

0 голосов
/ 03 декабря 2018

Для начала, строки:

li $v0,51
syscall

Будет читать целое число и помещать его в a0, но вы хотите прочитать строку, содержащую римское число.

Поэтому вам нужно где-то хранить эту строку, а затем (если вы обрабатываете один символьный номер) необходимо извлечь первый символ из этой строки.

Позже:

hundred:
  li $t1,100

fivehun: 
  li $t0,500

thousand:
  li $t1,1000

Все, что идет к этим меткам, в конечном итоге установит t1 равным 1000, поскольку код просто переходит к следующему утверждению, в отличие от того, что вы сделали с единицами, десятками и т. Д.

...