繁体   English   中英

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

[英]Simple yes/no loop to repeat/end - MIPS assembly (MARS)

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

考虑一下:

.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 

首先,在您的代码中,您似乎误解了系统调用的工作方式以及它们应如何与函数进行交互( 此处提供一些文档 )。 因为您的get例程基本上只称为syscall,所以我把它作为添加例程的原因排除在外,而此例程可能会增加而不是降低复杂性。

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

为了解决这个问题,我将syscall扩展为读取3个字符并回答以存储多达256个字符。将其扩展为对任何大小都安全的做法是使阅读器拥有了一定的特权。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM