如何在mars mips中刷新提示?

如何在mars mips中刷新提示?,mips,mars-simulator,Mips,Mars Simulator,很好,我尝试清除MARS(mips汇编程序)的默认提示符I/o,但我不确定如何做到这一点。在程序运行期间,我可以使用哪个代码或系统调用刷新屏幕 编辑:对不起,信息太差了。我说的是MARS中存在的“模拟MIPS控制台输出/输入”。我的问题是,在程序运行过程中,是否可以通过任何代码实现清除此控制台。有两种基本方法可以做到这一点,但它们都涉及捕获clear命令的输出[或使用其他TTY控制序列alalibcurses]。在下面的示例中,我捕获了clear命令的输出,并对其进行十六进制转储,以获取clea

很好,我尝试清除MARS(mips汇编程序)的默认提示符I/o,但我不确定如何做到这一点。在程序运行期间,我可以使用哪个代码或系统调用刷新屏幕


编辑:对不起,信息太差了。我说的是MARS中存在的“模拟MIPS控制台输出/输入”。我的问题是,在程序运行过程中,是否可以通过任何代码实现清除此控制台。

有两种基本方法可以做到这一点,但它们都涉及捕获
clear
命令的输出[或使用其他TTY控制序列ala
libcurses
]。在下面的示例中,我捕获了
clear
命令的输出,并对其进行十六进制转储,以获取
clear:.byte…

下面只需清除屏幕并输出经过的秒数,一个简单的屏幕清除演示。其他xterm
ESC
序列是可能的,就像在任何C程序中一样


如果我们在命令行模式下调用
mars
mars myfile.s
,那么syscall 4将连接到
xterm
窗口,并且以下操作将起作用:

    .data
msg:    .asciiz     "hello world\n"
clear:  .byte   0x1B,0x5B,0x33,0x3B,0x4A,0x1B,0x5B,0x48,0x1B,0x5B,0x32,0x4A
eclear:
        .byte 0x00

    .text
    .globl main
main:

main_loop:
    # clear the screen
    la      $a0,clear
    li      $v0,4
    syscall

    # output a number
    move    $a0,$t7
    li      $v0,1
    syscall
    addiu   $t7,$t7,1

    # wait a bit
    li      $t6,500000
main_delay:
    subiu   $t6,$t6,1
    bnez    $t6,main_delay
    j       main_loop

但是,如果我们在GUI模式下调用
mars
(例如
mars
),syscall 4将转到其正常的窗口窗格[它不理解类似xterm的转义序列],因此,上述操作将不起作用

但是,如果我们在程序中打开
/dev/tty
,对其进行写系统调用,我们可以将转义序列发送到调用
mars
命令的包含
xterm
窗口

这更为复杂,因为我们必须手工完成所有工作,但它是有效的:

    .data
ofile:  .asciiz     "/dev/tty"
msg:    .asciiz     "hello world\n"
clear:  .byte   0x1B,0x5B,0x33,0x3B,0x4A,0x1B,0x5B,0x48,0x1B,0x5B,0x32,0x4A
        .byte 0x00

sprintf_buf:
    .space  80
sprintf_bufe:

    .text
    .globl main
main:
    li      $v0,13                  # open file
    la      $a0,ofile               # filename to open
    li      $a1,1                   # 1=O_WRONLY
    li      $a2,0                   # mode [ignored]
    syscall
    move    $s7,$v0                 # remember open unit

main_loop:
    # clear the screen
    la      $a1,clear
    jal     fputs

    # format the progress number
    move    $a0,$t7
    addiu   $t7,$t7,1
    jal     sprintf

    # output the progress number
    jal     fputs

    # delay a bit
    li      $t0,500000
main_delay:
    subiu   $t0,$t0,1
    bnez    $t0,main_delay
    j       main_loop

# sprintf -- format a number
#
# RETURNS:
#   a1 -- pointer to buffer
#
# arguments:
#   a0 -- number to output
sprintf:
    la      $a1,sprintf_bufe        # get buffer pointer
    subi    $a1,$a1,1
    sb      $zero,0($a1)            # store EOS

    li      $t1,10                  # get decimal base

sprintf_loop:
    div     $a0,$t1                 # get both (num / 10) and (num % 10)
    mfhi    $t0                     # isolate digit (num % 10)

    # store ascii digit
    addi    $t0,$t0,'0'
    subiu   $a1,$a1,1
    sb      $t0,0($a1)              # store the digit

    mflo    $a0                     # num /= 10
    bnez    $a0,sprintf_loop

    jr      $ra

# fputs -- output string to "console"
#
# arguments:
#   s7 -- file descriptor
#   a1 -- pointer to string
fputs:
    move    $a2,$a1                 # get buffer address

# get string length
fputs_loop:
    lb      $t0,0($a2)              # get next char -- is it EOS?
    addiu   $a2,$a2,1               # increment length/buffer pointer
    bnez    $t0,fputs_loop          # no, loop

    subu    $a2,$a2,$a1             # get the length

    move    $a0,$s7                 # get file descriptor
    li      $v0,15                  # syscall for write
    syscall

    jr      $ra                     # return

你所说的[刷新]屏幕是什么意思?标准控制台?人机界面控制台?位图显示?如果你能把你的问题编辑得更具体一些,这对我[和你]都会有帮助。你可以发布你已经拥有的相关mips代码吗?“默认提示”I/O是什么意思?此外,您可能会重申您的问题,即您目前正在做什么,以及您希望整个计划做什么。您只想在C语言中输出类似于
fputs(…,stdout)
的消息吗?很抱歉,信息太差了。我说的是MARS中存在的“模拟MIPS控制台输出/输入”。我的问题是,是否可以在程序运行期间清除这个控制台,并使用任何代码实现。