c++ - 我的汇编代码有什么问题

标签 c++ assembly x86 dos x86-16

所以我正在用 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/

相关文章:

c++ - 在一个声明语句中定义一个函数和一个变量

c++ - 如何使用宏替换赋值操作以用于锁定函数

c++ - 如何优化 C++ avr 代码

x86 - 已编译引导加载程序的大小错误

c - gcc 循环构造对汇编代码的更改

c++ - 为什么这段代码在到达管道时停止运行?

optimization - 哪些非局部效应可以改 rebase 本 block 的性能?

程序集 8086 - 将一个缓冲区复制到另一个缓冲区

assembly - 比较汇编中的字符,nasm

c++ - 微软视觉 C++ 2010