5

だから私は MS-DOS 用の c++ でゲームを書いており、速度を上げるためにインライン アセンブリをいくつか含めています。この特定のコード ブロックは、星をビデオ メモリ (0A000h) に描画します。私のコードの問題は、dh が設定されている色に関係なく、1 つのピクセルしか描画しないことです。私の知る限り、mov dx, 00007h は、dh を 0 に、dl を 7 に設定することと同じです。何が問題なのですか?

同等の C/C++ コード (または少なくとも私の意図) は、各行の横にコメントされています。私のコンパイラはターボ C++ 3.0 です。8086/8088 命令のみを使用しようとしています。

また、MS-DOS がいかに古いかを知っているので、新しいコンパイラ/オペレーティング システム用のコードを書くように言わないでください。dos のコードを書くことは、私の趣味のようなものです。

pixelOffset = x + (y << 6) +  (y << 8);

_asm {
    mov  ax, WORD PTR pixelOffset
    mov  di, ax
    mov  ax, 0A000h         ;pointer to the video memory
    mov  es, ax
    mov  dx, 00007h         ;indexed color 00 and 07
    mov  cx, 0000Fh         ;indexed color white 0F
    add  ax, 2              ;pixelOffset += 2;
    mov  es:[di], dh        ;videomem[pixelOffset] = BLACK;
    add  ax, 319            ;pixelOffset += 319;
    mov  es:[di], dh        ;videomem[pixelOffset] = BLACK;
    add  ax, 1              ;pixelOffset += 1;
    mov  es:[di], dl        ;videomem[pixelOffset] = LIGHT_GRAY;
    add  ax, 1              ;pixelOffset += 1;
    mov  es:[di], dh        ;videomem[pixelOffset] = BLACK;
    add  ax, 317            ;pixelOffset += 317;
    mov  es:[di], dh        ;videomem[pixelOffset] = BLACK;
    add  ax, 1              ;pixelOffset += 1;
    mov  es:[di], dl        ;videomem[pixelOffset] = LIGHT_GRAY;
    add  ax, 1              ;pixelOffset += 1;
    mov  es:[di], cx        ;videomem[pixelOffset] = WHITE;
    add  ax, 1              ;pixelOffset += 1;
    mov  es:[di], dl        ;videomem[pixelOffset] = LIGHT_GRAY;
    add  ax, 1              ;pixelOffset += 1;
    mov  es:[di], dh        ;videomem[pixelOffset] = BLACK;
    add  ax, 317            ;pixelOffset += 317;
    mov  es:[di], dh        ;videomem[pixelOffset] = BLACK;
    add  ax, 1              ;pixelOffset += 1;
    mov  es:[di], dl        ;videomem[pixelOffset] = LIGHT_GRAY;
    add  ax, 1              ;pixelOffset += 1;
    mov  es:[di], dh        ;videomem[pixelOffset] = BLACK;
    add  ax, 319            ;pixelOffset += 319;
    mov  es:[di], dh        ;videomem[pixelOffset] = BLACK;
}
4

4 に答える 4

5

axを更新した後、diを更新するのを忘れていると思います

add ax,1
mov di,ax ;don't forget this line
mov es:[di],dl
于 2012-06-15T16:31:50.820 に答える
3

「di」を増やしているようには見えませんね。おそらく「movsb」のことでしょうか?

于 2012-06-15T16:29:17.797 に答える