Graphics 无限循环似乎在NASM中不起作用?

Graphics 无限循环似乎在NASM中不起作用?,graphics,nasm,dos,x86-16,bios,Graphics,Nasm,Dos,X86 16,Bios,我试图在NASM中制作一个DOS程序,它使用中断10h来显示一个像素,在左上角的16种可用颜色中循环。我还使用中断21h使程序每1/100秒(100fps)运行一次 然而,当我在DOSBox中实际运行程序时,像素只是保持红色。有人知道我的无限循环为什么不工作吗?(注意:我对NASM非常陌生,所以老实说,我对我的程序只工作15%的时间并不感到惊讶。)问题实际上不是循环本身。循环在每次迭代中所做的就是问题所在。我的一些问题和看法是: 由于这是一个DOS COM程序,您需要在顶部设置一个org 10

我试图在NASM中制作一个DOS程序,它使用中断10h来显示一个像素,在左上角的16种可用颜色中循环。我还使用中断21h使程序每1/100秒(100fps)运行一次


然而,当我在DOSBox中实际运行程序时,像素只是保持红色。有人知道我的无限循环为什么不工作吗?(注意:我对NASM非常陌生,所以老实说,我对我的程序只工作15%的时间并不感到惊讶。)

问题实际上不是循环本身。循环在每次迭代中所做的就是问题所在。我的一些问题和看法是:

  • 由于这是一个DOS COM程序,您需要在顶部设置一个
    org 100h
    ,因为DOS加载程序加载COM程序以偏移当前程序段的100h。否则,数据的偏移量将不正确,导致从错误的内存位置读取/写入数据

  • 您的
    mov al、pixelcolor
    有问题。它需要是
    mov al,[pixelcolor]
    。如果没有方括号1,
    pixelcolor
    的偏移量移动到AL,而不是存储在
    pixelcolor
    偏移量处的偏移量。这同样适用于
    pixelx
    pixely
    。您的代码将相同的像素颜色(本例中为红色)重复打印到屏幕上的错误位置2。此代码:

      mov ah,0ch
      mov al,pixelcolor
      mov cx,pixelx
      mov dx,pixely
      int 10h
      inc byte[pixelcolor]
    
    应该是:

      mov ah,0ch
      mov al,[pixelcolor]
      mov cx,[pixelx]
      mov dx,[pixely]
      int 10h
      inc byte[pixelcolor]
    
  • 应该注意的是,默认情况下计时器的分辨率仅为每秒18.2次(~55ms)。这比你期望的1/100秒的分辨率要低

  • 某些版本的DOS可能会始终为1/100秒的值返回0

  • 使用BIOS将像素写入屏幕可能会使编码更简单(它会抽象出视频模式中的差异),但与将像素直接写入内存相比,速度会非常慢

  • 我推荐Borland的Turbo调试器(TD)用于调试DOS软件。Turbo调试器包含在许多应用程序中


脚注
  • 1 NASM中括号的使用不同于
  • 2尽管您的问题说您想在屏幕的左上角写入,但代码表明您确实打算在坐标100100处写入像素

您需要设置一个开发环境,让您调试代码,如果代码正在循环或崩溃,则使用调试器单步执行,查看发生了什么。不过,我不知道在DOS下运行过时的16位DOS代码有什么好处。啊,我明白了。没想到我糟糕的NASM代码还能工作,至少可以说我的汇编语言技能已经生锈了。现在我需要去睡觉,明天我会检查你的答案是否真的解决了任何问题。还有,我知道它应该把像素写在100100。不知道我在写作时怎么没有注意到这个。好了,现在可以了。谢谢
  mov ah,0ch
  mov al,[pixelcolor]
  mov cx,[pixelx]
  mov dx,[pixely]
  int 10h
  inc byte[pixelcolor]