【问题标题】:Getting the pixel value in masm 8086 assembly languagemasm 8086汇编语言获取像素值
【发布时间】:2022-11-26 07:59:18
【问题描述】:

我在masm 8086汇编语言上画砖,想知道有没有返回屏幕像素值的指令。

currently there is no code

【问题讨论】:

  • 使用您想要的任何指令,视频 RAM 是可读和可写的。要将一个字节加载到寄存器中,当然可以在帧缓冲区中的地址上使用 mov,使用内存源而不是内存目标。
  • 您使用的是 MASM 还是 emu8086?这些是不同的汇编器(EMU8086 也是带有模拟器和调试器的 IDE。)如果您没有任何代码,请不要在您的问题中包含代码块。但展示您如何绘制积木可能是个好主意。

标签: assembly masm proc emu8086


【解决方案1】:

返回屏幕像素值的任何指令。

看到你提到“画砖”和谈论“像素”,我知道你正在研究图形视频模式。

我将进一步假设此视频模式是 256 色模式 13h (320 x 200),这是最容易编程且色彩最丰富的传统视频模式(模式编号低于 20)。

您可以要求 BIOS 为您提供屏幕上任何像素的颜色

; CX is X [0,319]
; DX is Y [0,199]
; -> AL is color [0,255]
; IN (cx,dx) OUT (al) MOD (ah)
GetPixel:
  push bx
  mov  bh, 0        ; DisplayPage
  mov  ah, 0Dh      ; BIOS.GetPixel
  int  10h          ; -> AL
  pop  bx
  ret

依靠 BIOS 是一种安全且紧凑的解决方案,也适用于任何其他传统视频模式。

您可以自己读取屏幕上任何像素的颜色

; CX is X [0,319]
; DX is Y [0,199]
; -> AL is color [0,255]
; IN (cx,dx) OUT (al) MOD (ah)
GetPixel:
  push ds           ; DirectionFlag (DF) assumed 0
  push bx
  push dx
  mov  ax, 0A000h   ; Video buffer for 256-color mode 13h (320 x 200)
  mov  ds, ax
  mov  ax, 320      ; BytesPerScanline (BPS)
  mul  dx           ; Y * BPS
  add  ax, cx       ; Y * BPS + X
  mov  bx, ax       ; BX is address
  mov  al, [BX]     ; AL is color
  pop  dx
  pop  bx
  pop  ds
  ret

自己读取视频内存需要更多的代码,在其他传统视频模式下有些麻烦,但比使用 BIOS 功能快得多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多