1

Bresenham アルゴリズムを使用して、さまざまな半径の長さの円 (コンソールでユーザーが提供) を描画する 1 bpp BMP ファイルを作成して保存するプログラムを MIPS アセンブリで作成したいと考えています。

今のところ、直径の整数値用に明確に定義された BMP ファイルがありますが、さらに 2 つのことに苦労しています。

  • ビットマップの正しいアドレスにピクセルを描画する
  • 正しい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 アセンブリの異なるビッグ/リトルエンディアンに関連しているかどうか疑問に思います。もしそうなら、どうすれば修正できますか?

ご協力いただきありがとうございます。おそらく、この部分で私を導くことができれば、ブレゼンハムアルゴリズムに関する2番目の質問は必要ありません.

4

1 に答える 1

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 が含まれ、その原点が左下隅にあり、ライン間のオフセットが負であることを考慮する必要があります ( biHeight が正の場合)。 )

于 2014-12-22T06:20:32.490 に答える