【问题标题】:Beginner to MIPS, why won't it print my third prompt?MIPS 初学者,为什么它不打印我的第三个提示?
【发布时间】:2019-06-19 13:13:25
【问题描述】:

我正在尝试在 MARS(MIPS 汇编器和运行时模拟器)中编写一个程序,该程序将从用户那里获取两个整数,然后根据用户选择的操作进行相加或相乘。无论如何,我还没有深入了解该程序,但是我真的不明白为什么它不会打印我的第三个提示。你能帮帮我吗?

.data
prompt1: .asciiz "Enter an Integer!"
prompt2: .asciiz "Enter Another Integer!"
prompt3: .asciiz  "Would you like to add or multiply? (+ for add, * for multiply)"
resultout: .asciiz "The result is:"

.text

main:
    la $a0, prompt1
    li $v0, 4
    syscall
    li $v0, 5
    syscall
    add $t0, $v0, $zero

    la $a0, prompt2
    li $v0, 4
    syscall
    li $v0, 5
    syscall
    add $t1, $v0, $zero

    la $a0, prompt3
    li $v0, 12
    syscall
    li $v0, 11
    syscall
    add $t2, $v0, $zero

【问题讨论】:

  • 什么是系统调用 12?这似乎是第一个问题。

标签: assembly mips emulation


【解决方案1】:

要打印提示并获取单个字符,我认为您需要立即将$v0 的正确值加载到syscall。根据 MA​​RS 4.5 帮助文件,可用服务表建议您的代码从第 24 行开始应该是这样的:

la $a0, prompt3
li $v0, 4
syscall
li $v0, 12
syscall

也就是说,您想“打印字符串”prompt3 中的任何内容,然后“读取字符”以获取单个字符。你打的第一个syscall是12,是“读字符”,所以它在等你输入。

我建议将代表特定系统调用的幻数(例如 4 和 12)作为常量放入代码中:

.eqv SYS_PRINT_STRING 4
[...]
li $v0, SYS_PRINT_STRING

【讨论】:

  • 不要将魔术常量放在.data 部分——这会浪费内存!使用像这样的常量定义:.eqv SYS_PRINT_STRING 4
猜你喜欢
  • 1970-01-01
  • 2022-10-14
  • 2022-12-02
  • 1970-01-01
  • 2016-02-01
  • 1970-01-01
  • 2019-06-26
  • 1970-01-01
  • 2020-05-13
相关资源
最近更新 更多