MIPS汇编之绘图
没想到MIPS的模拟器WinMIPS64居然还有绘图功能,我忍不住想试一试。
基本思想就是,给定要绘制的像素点的坐标(X)和坐标(Y)以及RGB值,通过调用WinMIPS64提供的5号IO功能在屏幕上绘制像素点
于是按照这里的教程
WinMIPS64 — Documentation Summary (dcu.ie)
CONTROL
are as follows:CONTROL | Usage |
---|---|
Write Operations |
|
|
set |
|
set |
|
set |
|
set |
|
set |
Read Operations |
|
|
read |
|
read one byte from |
Other Operations |
|
|
clear the terminal screen |
|
clear the graphics screen |
根据上表,我应该往DATA中传4字节的RGB值,再往DATA+4和DATA+5里传X和Y的值
最后把CONTROL功能号置为5,这样该软件就可以为我自动绘制图像了。
我写出了如下的IO程序,期望可以在屏幕上打印出若干个指定色彩的像素点。
1 .data 2 CONTROL: .word32 0x10000 3 DATA: .word32 0x10008 4 #positionx: .byte 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 5 rgb: .word32 0xD2B48C 6 len: .word 0xff 7 #hello: .asciiz 'hello\nhello\n' 8 .text 9 # initiate 10 ld $t1,len($zero) 11 daddi $t2,$zero,5 # control word = 5 plot function 12 lwu $t3,CONTROL($zero) # $t3 is control port 13 lwu $t4,DATA($zero) # $t4 is data port 14 lwu $t6,rgb($zero) 15 #daddi $t7,$zero,hello 16 #daddi $t6,$zero,0 17 sw $t6,($t4) 18 #sd $t7,($t4) 19 # loop 20 loop: 21 daddi $t1,$t1,-1 22 slt $t5,$t1,$zero 23 bnez $t5,end 24 25 sb $t1,4($t4) 26 sb $t1,5($t4) 27 28 sd $t2,($t3) # plot 29 j loop 30 31 end: 32 halt
上面的代码看起来是不是有点乱?
确实,博主写代码的时候思路不够清晰,而且其中含有部分用于测试的代码。
比如
#hello: .asciiz 'hello\nhello\n' #daddi $t7,$zero,hello #sd $t7,($t4)
这几行代码都是当时为了调试所加的
因为博主不确定bug是那个部分引起的
先跑一个hello程序,如果可以,说明IO功能调用应该没有问题,问题就出在RGB、X、Y的存取上
我在跑hello程序的时候,程序是这样的:
1 .data 2 CONTROL: .word32 0x10000 3 DATA: .word32 0x10008 4 #positionx: .byte 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 5 rgb: .word32 0xD2B48C# ,0xFFD700,0x00FF7F, 0xEE82EE,0x8B7765 6 len: .word 0xff 7 hello: .asciiz 'hello\n' 8 .text 9 # initiate 10 ld $t1,len($zero) 11 daddi $t2,$zero,4 # control word = 5 plot function 12 lwu $t3,CONTROL($zero) # $t3 is control port 13 lwu $t4,DATA($zero) # $t4 is data port 14 lwu $t6,rgb($zero) 15 daddi $t7,$zero,hello 16 #daddi $t6,$zero,0 17 #sw $t6,($t4) 18 sd $t7,($t4) 19 # loop 20 loop: 21 daddi $t1,$t1,-1 22 slt $t5,$t1,$zero 23 bnez $t5,end 24 25 sb $t1,4($t4) 26 sb $t1,5($t4) 27 28 sd $t2,($t3) # plot 29 j loop 30 31 end: 32 halt
原本预计它应当输出255行的”hello“的,但是只输出了1行
这是什么原因?
我在仔细排查后,发现,是由于
sb $t1,4($t4)
sb $t1,4($4)
使得DATA端口的4、5字节都被篡改了
原本应该是0、0的
现在变成了$t1的值
当$t1是0xff到1的时候,都是错误的值,都无法输出
只有当$t1为0的时候,才能正常输出,因此只能输出1个hello
我将其修改过来,即删除上述的2行代码(或注释掉)
发现程序的行为正确了。
接下来我就开始进行图形绘制程序的测试。
发现可以正常进行绘图操作,挺开心的。
谢谢您的耐心阅读,本人博客写作能力有限,请读者斧正,留下你的宝贵建议,感激不尽!