如何在没有任何BIOS中断的情况下使用x86组件设置整个屏幕的像素?

时间:2014-12-07 16:34:49

标签: assembly x86

 .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汇编?

3 个答案:

答案 0 :(得分:0)

“Dos screen”是什么意思?

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

当然,无法在屏幕外“设置”任何像素,因此您无法在“Dos屏幕”之外设置任何像素。

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

答案 1 :(得分:0)

在文本模式下,将ES设置为0b800h。将di设置为(当前行数*列的数量+当前列)* 2。将ah设置为(8 * bgcolor(0-7)+ foregroundcolor)+(+ 128,如果文本应该闪烁)。如果当前屏幕不是0,您应该添加网页的编号乘以(屏幕上最后一个字符的偏移量+ 2)。将ASCII代码设置为al(例如65表示A)并用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不会改变视频模式。

答案 2 :(得分:0)

一开始我还使用了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

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