所以我正在用 c++ 为 MS-DOS 编写一个游戏,并且为了提高速度我加入了一些内联汇编。这个特定的代码块会在视频内存 (0A000h) 中绘制一个星号。我的代码的问题在于,无论 dh 设置为什么颜色,它都只绘制一个像素。据我所知mov dx,00007h相当于设置dh为0,dl为7,有什么问题吗?
等效的 C/C++ 代码(或至少是我的意图)在每一行旁边都有注释。我的编译器是 Turbo 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;
}
最佳答案
我想你在更新 ax 之后忘记更新 di
add ax,1
mov di,ax ;don't forget this line
mov es:[di],dl
关于c++ - 我的汇编代码有什么问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11054688/