在MIPS中,endianess如何使用Bresenham算法影响BMP文件中的绘制像素?

时间:2014-12-21 23:50:27

标签: algorithm mips endianness bresenham

我想在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算法的第二个问题。

1 个答案:

答案 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}})