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