изменение этой программы IO MIPS для работы с нулевой завершающей строкой - PullRequest
0 голосов
/ 07 октября 2019

Прежде всего, спасибо, что нашли время помочь мне. Я новичок в архитектуре Comp и MIPS и увлечен изучением этого материала, так что извините за нелюбовь. Во-вторых, прежде чем вы скажете, что открыты другие дискуссии на эту тему - я пытался, и они не вписываются в текущую проблему. Я пытаюсь изменить мою текущую программу для поиска нулевого завершенного символа. вместо того, что происходит, чтобы проверить только 4 символа, прежде чем он выходит. Я использую MARS IDE и MMIO KeyBoard & Display для этого назначения

Я попытался изменить основной: просто загрузить буфер, а не место для 4 символов.

IЯ посмотрел на цикл опроса и ветвь в цикле и Bne в getNchar. Может быть, он просто не щелкает со мной

Вот мой главный.

# Program to input and output a 4 character field

# Data area
.globl main
.data
buffer: .space  80

    .text
main:   
# get 4 characters from the keyboard and save them in the buffer
    la  $a0, buffer 
    li  $a1, 4
    jal getNChar

# put 4 characters from the buffer to the display   
    la  $a0, buffer # no need to move the characters (redundant move for illustration only)
    li  $a1, 4
    jal putNChar

# Exit
    li      $v0, 10     
    syscall         

Вот мой GetString (в настоящее время работает на 4Chars)

# Get  n character procedure

# Memory mapped addresses of device fields.
.eqv kbInCtl 0xFFFF0000     # 0xFFFF0000 rcv contrl
.eqv kbInData 0xFFFF0004    # 0xFFFF0004 rcv data
.eqv dispOutCtl 0xFFFF0008  # 0xFFFF0008 tx contrl
.eqv dispOutData 0xFFFF000c # 0xFFFF000c tx data

# Pseudo code
#   $t0 = 0
#   while ($t0 < &a1) {
#       loop until character is available
#       move character to buffer address offset by $t0
#       $t0+=1
#       } 
#   return      

# buffer address in $a0
# number of characters to read in $a1
.globl getNChar
.text           
getNChar:       

    la     $t1,kbInCtl      # set up register for input control word
    li  $t2, 0          # initialize counter
loop:
    lw  $t3,0($t1)          # read rcv ctrl
    andi    $t3,$t3,0x0001      # extract ready bit
    beq $t3,$0,loop     # keep polling till ready
# move character    
    lb  $t4,kbInData        # read character into temporary register
    add $t5, $a0, $t2       # calculate store address
    sb  $t4, 0($t5)
    addi    $t2, $t2, 1     # increment counter
    slt $t5, $t2, $a1       # test for end of loop
    bne $t5, $zero, loop  
    jr  $ra         # if end do return

А вот и мой PutString (также работает с 4-мя символами)

# put N Characters procedure
# Memory mapped addresses of device fields.
.eqv kbInCtl 0xFFFF0000     # 0xFFFF0000 rcv contrl
.eqv kbInData 0xFFFF0004    # 0xFFFF0004 rcv data
.eqv dispOutCtl 0xFFFF0008  # 0xFFFF0008 tx contrl
.eqv dispOutData 0xFFFF000C # 0xFFFF000c tx data

# Pseudo code
#   $t2 = 0
#   while ($t2 < &a1) {
#       loop all previous output complete
#       move character from buffer address offset by $t2 to disp out word
#       $t2+=1
#       }
#   loop to be sure last character output before return 
#   return      

# buffer address in $a0
# number of characters to output in $a1
.globl putNChar
putNChar:       

    la      $t1,dispOutCtl  # set up register for output control word
    la  $t5,dispOutData
    li  $t2, 0      # initialize counter
#   j   output  
# loop until last character written out
loop:   lw  $t3,0($t1)  # read disp ctrl
    andi    $t3,$t3,0x0001  # extract ready bit 
    beq $t3,$0,loop     # poll till ready for next character
output: add     $t4, $a0, $t2   # calculate output byte address
    lbu $t6, 0($t4) # move byte to output field
    sw  $t6, ($t5)
    addi    $t2, $t2, 1 # increment counter
    slt     $t7, $t2, $a1   # test end of loop
    bne $t7, $zero, loop
    jr  $ra     # return
...