我想在MIPS程序集中创建一个程序,它创建并保存一个1 bpp的BMP文件,其中包含一个半径不等的圆圈。长度(由控制台上的用户提供)将使用Bresenham算法绘制。
目前,我有一个明确定义的BMP文件,用于直径的整数值,但是我还在努力做两件事:
以下是我在代码中负责在正确的地址位置绘制像素的代码的一部分:
# $t2 - length of row + padding
# $t3 - initial address of a bitmap (header)
# $t4 - pointer to move values from BMP header parameters onto the heap
.macro drawPixel(%x,%y)
addiu $t4, $t3, 62 # starting address of a pixel map
mult %y, $t2 # pixel y-value multiplied by row length
mflo $a2
addu $t4, $t4, $a2 # y-value pixel address computation
divu $a2, %x, 8 # pixel x-value divided by 8 to obtain number of bytes
addu $t4, $t4, $a2 # x-value pixel address computation
mfhi $a3
#addiu $a3, $a3, -1
li $a2, 1
srlv $a2, $a2, $a3
lb $a3, ($t4) # loading byte at the address of pixel map start (="white" byte)
or $a3, $a3, $a2 # adds a new coloured byte to a "white" byte
sb $a3, ($t4) # loads byte with a coloured pixel
.end_macro
enter code here
下面的部分是一个简单的例子,出于测试目的,显示像素不显示在有意的地方:
li $a0, 0
li $a1, 0
drawPixel($a0, $a1)
li $a0, 4
li $a1, 0
drawPixel($a0, $a1)
虽然,我的程序绘制像素,但它们在某种程度上是相反的顺序。我想知道这是否与MIPS汇编中的不同大/小端相关联,如果是这样,我该如何解决?
非常感谢您的帮助,也许如果您能指导我完成此部分,则不需要关于Bresenham算法的第二个问题。
答案 0 :(得分:0)
大/小端是字中的字节顺序,而不是位。
如果您的像素在每个8像素组中从左向右反射,请查看在单色位图(x86 asm)中设置像素的示例。对您而言重要的一部分 - MaskToSetABit = 0x80 shr (X mod 8)
mov ecx,edx //X coordinate
and ecx, 7 //X mod 8
mov edx, $80
shr edx,cl //mask to isolate needed bit
or ebx,ebx
jz @@IsZero
or eax,edx //set bit to 1
如果所有线都是从上到下反射的,那么你必须考虑到大多数位图包含自下而上的DIB,它的'原点是左下角,而线 - 线偏移是负的({ {3}})