简单的是/否循环重复/结束 - MIPS汇编(MARS)

时间:2013-11-27 18:43:53

标签: loops assembly mips mips32 mars-simulator

b我不太确定为什么它没有阅读输入并决定重复或结束..这是我的代码,帮助将不胜感激!

.data  
again:
    .asciiz "Again (y or n)? "  
answer:
    .asciiz " "  

.text  
.globl main  
  main:
    li  $v0, 4  
    la  $a0, again  
    syscall  

    la  $s4, answer
    jal get 

    beq $v0, 'y', main
    beq $v0, 'Y', main

    li  $v0, 10 
    syscall 

  get:  
    li  $v0, 12  
    li      $a1, 2  
    syscall  
    jr  $ra

1 个答案:

答案 0 :(得分:3)

考虑一下:

.data
again:
    .asciiz "Again (y or n)? "  
answer:
    .space 256

.text  
.globl main  
  main:
    li  $v0, 4  
    la  $a0, again  
    syscall  

    la  $a0, answer
    li  $a1, 3
    li  $v0, 8
    syscall

    lb  $t4, 0($a0)

    beq $t4, 'y', main
    beq $t4, 'Y', main

    li  $v0, 10 
    syscall 

首先,在您的代码中,您似乎误解了系统调用的工作方式以及它们应该如何与函数进行交互(some docs here)。因为你的get例程基本上只是调用了一个系统调用,所以我把它当作为基本可能增加复杂性而不是减少它的东西添加一个例程。

接下来,您的代码的主要问题是对输入缓冲的工作方式的误解。在您的代码中,您为answer分配了2个字节的空间,然后使用syscalls一次获得不超过2个字节的空间。这对stdin不起作用,因为在大多数系统上,stdin是行缓冲的,这意味着用户必须按ENTER才能刷新流。这意味着当用户输入'y'时,syscall实际上会返回"y\n\0"

为了解决这个问题,我将syscall扩展为3个字符并回答最多可存储256个字符。扩展此字符以保证任何大小都是安全的,这是读者留下的优点。