Прежде всего, спасибо, что нашли время помочь мне. Я новичок в архитектуре 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