簡體   English   中英

鍵盤的MIPS匯編輸入失敗

[英]MIPS Assembly input from keyboard fail

我正在嘗試編寫一個打開文件的MIPS代碼,讀取它並在用戶輸入從鍵盤輸入(新行)時直到文本文檔末尾打印出一行。 但不知何故,程序會跳過用戶輸入而不等待輸入。

碼:

.data
buffer: .space 4
fin: .asciiz "input.txt" # filename for input
myName: .asciiz "\nTheUserName"

.text
openfile:
li   $v0, 13       # system call for open file
la   $a0, fin      # board file name
li   $a1, 0        # Flag for reading
li   $a2, 0
syscall
add $s7, $v0, $0 # save the file descriptor
read:
#read from file code goes here
li   $v0, 14       # system call for read from file
move $a0, $s7      # file descriptor 
la   $a1, buffer   # address of buffer to which to read
li   $a2, 1        # hardcoded buffer length
syscall
beq $v0,$0,exit #exit if EOF is seen
print:
#print file code goes here
la $a0, buffer       # address of string to be printed
li $v0, 4            # print string
syscall
beq $a0,0x0A, input #check whether the character read from the file is ‘\n’ (new line) or not
b read
input:
#get input code goes here
li $v0, 12
syscall
beq $v0, 0x0A, read #check whether the character read from the keyboard is ‘\n’ (new line) or not
b input
exit:
# Close the file code goes here
li   $v0, 16       # system call for close file
move $a0, $s7      # file descriptor to close
syscall # close file
name:
# Print your name and surname on the screen as a string as the last line
li $v0, 4
la $a0, myName
syscall

輸入文件:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris tristique dui at ornare pretium.
Phasellus ac vehicula libero. Fusce scelerisque dolor ipsum, vitae suscipit sapien dictum quis.
Praesent sed libero tellus. In vitae laoreet massa.
Duis vehicula fringilla orci, et iaculis nulla malesuada in.
Nam at cursus nisi. Duis convallis magna quis dolor aliquam ullamcorper.
Nunc sollicitudin a leo in placerat. Cras id pretium ligula, sed facilisis massa.
Curabitur semper ultricies nulla non lacinia. Nunc a fermentum ex, nec egestas ligula.
Quisque varius libero sed rhoncus venenatis. Cras pulvinar ultrices dignissim.

好的,我修好了你的程序。

主要問題是文件輸入的換行測試不正確。 你比較$a0 [這是緩沖區地址 ]對換行,而不是緩沖區的第一個字符。

還有另外兩個錯誤。

我已經注釋了錯誤以及修復[請原諒無償的樣式清理]:

    .data
buffer:     .space      4
fin:        .asciiz     "input.txt"     # filename for input
myName:     .asciiz     "\nTheUserName"

    .text

openfile:
    li      $v0,13                  # system call for open file
    la      $a0,fin                 # board file name
    li      $a1,0                   # Flag for reading
    li      $a2,0
    syscall
    add     $s7,$v0,$0              # save the file descriptor
# NOTE/BUG: this line was missing -- actually it may be optional -- try with
# and without it to see the effect:
    b       input                   # pause for user input _before_ 1st line

read:
    # read from file code goes here
    li      $v0,14                  # system call for read from file
    move    $a0,$s7                 # file descriptor
    la      $a1,buffer              # address of buffer to which to read
    li      $a2,1                   # hardcoded buffer length
    syscall
    beq     $v0,$0,exit             # exit if EOF is seen

print:
    # print file code goes here
    la      $a0,buffer              # address of string to be printed
# NOTE/BUG: add the following line:
    sb      $zero,1($a0)            # ensure we have EOS at end of string
    li      $v0,4                   # print string
    syscall
# NOTE/BUG: add the following line -- it was the _real_ bug:
    lb      $a0,0($a0)              # get buffer char value
    beq     $a0,0x0A,input          # is file char newline?
    b       read

input:
    # get input code goes here
    li      $v0,12
    syscall
    beq     $v0,0x0A,read           # is keyboard char newline?
    b       input

exit:
    # Close the file code goes here
    li      $v0,16                  # system call for close file
    move    $a0,$s7                 # file descriptor to close
    syscall                         # close file

name:
    # Print your name and surname on the screen as a string as the last line
    li      $v0,4
    la      $a0,myName
    syscall

    li      $v0,10
    syscall

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM