所以我正在用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;
}
答案 0 :(得分:5)
我认为您在更新ax后忘记更新di
add ax,1
mov di,ax ;don't forget this line
mov es:[di],dl
答案 1 :(得分:3)
看起来你似乎没有增加&#34; di&#34;,是吗?也许你的意思是&#34; movsb&#34;?
答案 2 :(得分:0)
lea指令也存在于16位:
lea di,[di+1] ; substitute for "inc di" and/or "add di,1" , if we do not need a flag
德克
答案 3 :(得分:0)
没有必要使用ax
来增加基数 - 首先;还有只有位移的寻址模式(也被认为是绝对地址)
mov es:[1001], dh
mov es:[1002], dl
mov es:[1535], cl
为了使它更有用 - 你可以使用偏移量,例如。作为你明星的中心:
mov es:[di - WIDTH], ... ;; pixel / character above the current cursor
mov es:[di + WIDTH], ... ;; pixel / char below
mov es:[di + 1], ... ;; pixel right to the origin etc.
使用段覆盖前缀es:
代价很高。相反,我建议使用
mov ax, 0a000h
push ds
mov ds, ax
//
mov [di + offset], cl ;; this pays off when writing several pixels
//
pop ds ;; restore DS after you have copied your stuff