だから私は 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;
}