【问题标题】:How can i set pixels of whole screen with x86 assembly without any BIOS interrupts?如何在没有任何 BIOS 中断的情况下使用 x86 程序集设置整个屏幕的像素?
【发布时间】:2015-09-20 16:49:18
【问题描述】:
 .MODEL SMALL
 .CODE
start:
 mov ax,012h ;VGA mode
 int 10h ;640 x 480 16 colors.
 mov ax,0A000h
 mov es,ax ;ES points to the video memory.
 mov dx,03C4h ;dx = indexregister
 mov ax,0F02h ;INDEX = MASK MAP, 
 out dx,ax ;write all the bitplanes.
 mov di,0 ;DI pointer in the video memory.
 mov cx,38400 ;(640 * 480)/8 = 38400
 mov ax,0FFh ;write to every pixel.
 rep stosb ;fill the screen
 mov ah,4ch ;go back 
 int 21h ; to DOS.
 END start

上面的代码只设置了Dos屏幕的像素,我想改变我显示器上的每个像素,在用户模式下用x86汇编可以吗?

【问题讨论】:

  • 只有当 DOS 是您的实际操作系统时才有可能。如果你在 Windows 下运行它,那么 Windows 会管理屏幕缓冲区,不会让你直接触摸它。

标签: assembly x86


【解决方案1】:

“Dos 屏幕”是什么意思?

如果您在 Windows 或 Linux 下使用 DOS 仿真,则此仿真模拟一台计算机,“Dos 屏幕”是运行 DOS 的真机的“全屏”将显示的内容。

当然,不能在屏幕“外部”设置任何像素,因此您不能在“Dos 屏幕”外部设置任何像素。

您可以在全屏模式下运行 DOS 模拟器...

【讨论】:

  • "你不能在"Dos screen"之外设置任何像素"" 那么windows程序如何将像素写入屏幕呢?他们应该怎么做?
  • @bluejayke 我们在最初的问题中有一个限制:用户想要编写一个在 MS-DOS 仿真(例如 DOSEMU 或 QEMU)中运行的 MS-DOS 程序。 Windows 程序不能在这样的仿真中运行。当然:理论上,可以使用DOS模拟器的网络系统连接第二个工具(例如X11服务器)......
  • 很有趣,但是否可以在不通过 windows API 的情况下在 windows 中将像素写入屏幕?
  • @bluejayke 否。在具有 MMU 的计算机上运行的现代操作系统都不允许直接访问硬件。您必须使用操作系统的 API 才能访问屏幕。使用 MS-DOS 模拟器时,模拟器本身使用 Windows API 将数据从模拟的显示 RAM 复制到真实屏幕。
【解决方案2】:

在文本模式下,将 ES 设置为 0b800h。将di设置为(当前行数*列数+当前列)*2。将 ah 设置为 (8*bgcolor(0-7)+foregroundcolor)+(+128,如果文本应该闪烁)。如果当前屏幕页不是 0,则应添加屏幕页数乘以(屏幕上最后一个字符的偏移量+2)。在 al 中设置 ASCII 码(例如 A 为 65)并用 stosw 写 ax。示例:

mov ax, 0b800h
mov es, ax   ;set es register to video memory
mov di, (2*(5*80+0))  ;(nullbased) row:6, col: 1 
mov ah, (5*16+2)  ; bgcolor:5 foreground: 2
mov al, 65   ;ASCII of A
stosw

在 256 色的 320x200 图形模式下,将 ES 设置为 0a000h。程序必须设置像素而不是字母。 如果要使用图形模式,请将 ax 设置为 19 并调用 int 10h,然后再将其写入屏幕,因为更改 ES 不会更改视频模式。

【讨论】:

    【解决方案3】:

    一开始我也使用了 16 色图形模式。但是对于 16 色图形模式,我们需要至少有一个端口访问才能将一个像素设置到屏幕上。而且这个端口访问速度很慢。所有其他具有 8、15、16、24、32 位颜色的常规图形模式都更容易使用(就像 van Uitkon 在评论中所说)。

    这是我第一个使用 16 色的小程序之一。在下面的像素设置例程中,我展示了如何使用 16 色图形模式将单个像素设置到屏幕上。

    .MODEL SMALL
    .386
    .CODE
     ORG 0100h
    
           MOV     AX, @DATA
           MOV     DS, AX
           MOV     ES, AX
           MOV     AX, 0A000h
           MOV     FS, AX
    
           MOV     AX, 12h       ; Mode 640 x 480 x 4 bit color
           INT   10h
    
    P10B:  MOV     AX, 140h      ; X Position
           MOV     BX, 0F0h      ; Y Position
    P111:  MOV     CX, 1         ; Radius
           MOV     [XPOS], AX    ; Edit: need right square bracket, was "}" before
           MOV     [YPOS], BX    ; Edit: need right square bracket, was "}" before
           MOV     [RADI], CX
           MOV     [R0E], AX
           ADD     AX, CX
    
    P200:  MOV     GS, AX
           MOV     AX, [R0E]
           SUB     AX, [XPOS]
           ADD     AX, [YPOS]
           MOV     [R10], AX
           SUB     AX, [YPOS]
           MOV     [R14], AX
           MOV     AX, [R0E]
           SUB     AX, [XPOS]
           XOR     SI, SI
           MOV     DI, 2
           CALL P600
           MOV     AX, [R14]
           MOV     SI, 2
           XOR     DI, DI
           CALL P600
           MOV     AX, GS
           INC    WORD PTR [R0E]
           CMP     [R0E], AX
           JNZ P200
    
           INC    BYTE PTR CS:[P111+1]       ; increase Radius
           CMP    BYTE PTR CS:[P111+1], 0E0h
           JNZ P10B
           MOV    BYTE PTR CS:[P111+1], 1
    
    TASTE: MOV     AX, 1
           INT   16h
           CMP     AL, 20h                   ; space key
           JNZ TASTE
           MOV     AX, 3                     ; Text-Mode
           INT   10h
           MOV     AX, 4C00h
           INT   21h
    
    ;--------------------- S u b - Routinen ------------------------------
    
    P600:  MUL     AX
           MOV     [SI+R18], AX
           MOV     AX, [RADI]
           MUL     AX
           MOV     [R16], AX
           SUB     AX, [SI+R18]
           MOV     CX, AX
    
           MOV     DX, 1
           MOV     BX, 1
    P406:  STC
           SBB     CX, DX
           JB  P411
           INC     BX
           ADD     DX, 2
           JMP  P406
    
    P411:  ADD     BX, [DI+XPOS]
           MOV     [DI+R06], BX
           SUB     BX, [DI+XPOS]
           MOV     AX, [DI+XPOS]
           SUB     AX, BX
           MOV     [DI+R0A], AX
           MOV     AX, [SI+R0E]
           MOV     [SI+R06], AX
           SUB     AX, [SI+XPOS]
           MOV     BX, [SI+XPOS]
           SUB     BX, AX
           MOV     [SI+R0A], BX
    
           MOV     BP, [R06]
           MOV     BX, [R08]
           CALL PIXEL
           MOV     BP, [R06]   ; Edit: undifined symbol R069
           MOV     BX, [R0C]
           CALL PIXEL
           MOV     BP, [R0A]
           MOV     BX, [R08]
           CALL PIXEL
           MOV     BP, [R0A]
           MOV     BX, [R0C]
    
    PIXEL: MOV     CX, BP        ; BP = X  /  BX = Y
           SHR     CX, 3
           MOV     AX, 50h       ; Lenght of scanline
           MUL     BX
           ADD     AX, CX
           MOV     SI, AX
           INC     CX
           MOV     AX, CX
           SHL     AX, 3
           SUB     AX, BP
           DEC     AX
           MOV     CL, AL
           MOV     AH, 1         ; 2 ^ (((X/8) + 1) * 8 - X) - 1
           SHL     AH, CL        ;  = Pixel pos.
           MOV     DX, 3CEh
           MOV     AL, 8         ; Pixel-Mask
           OUT     DX, AX
           MOV     AX, 205h      ; Write Mode 2
           OUT     DX, AX
           MOV     AH, 5         ; color
           MOV     AL, FS:[SI]   ; dummy read for to adjust the address
           MOV    FS:[SI], AH
           RET
    
    .DATA
    
    XPOS   DW ?
    YPOS   DW ?
    RADI   DW ?
    R06    DW ?
    R08    DW ?
    R0A    DW ?
    R0C    DW ?
    R0E    DW ?
    R10    DW ?
    R14    DW ?
    R16    DW ?
    R18    DW ?
    
    .STACK 20h
     END
    

    抱歉,我现在编辑错误行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-28
      相关资源
      最近更新 更多