1

我想在 MIPS 程序集中创建一个程序,它制作并保存一个 1 bpp BMP 文件,其中将使用 Bresenham 算法绘制一个不同半径长度的圆(由用户在控制台上提供)。

目前,我有一个定义明确的 BMP 文件,用于直径的整数值,但是我正在努力解决另外两件事:

  • 在位图的右地址绘制像素
  • 实施正确的Bresenham 算法一次应用 8 个点

这是我在文本段中负责在正确地址位置绘制像素的代码的一部分:

    # $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 算法的第二个问题。

4

1 回答 1

0

Big/little-endiannes 用于字中的字节顺序,而不是位。

如果您的像素在每个 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,它的原点是左下角,并且line-line offset为负(当biHeight为正时)

于 2014-12-22T06:20:32.490 回答