Программа Mips не печатает правильную строку

Я создаю программу для преобразования римских цифр. Я ввожу буквы (римские цифры), и на выходе должно быть соответствующее целое число. Когда я ввожу римскую цифру, она говорит, что число равно 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 

вы пробовали использовать отладчик?

lostbard 03.12.2018 16:27
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
173
1

Ответы 1

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

li $v0,51
syscall

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

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

Позже:

hundred:
  li $t1,100

fivehun: 
  li $t0,500

thousand:
  li $t1,1000

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

Другие вопросы по теме