.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汇编?
答案 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
很抱歉我现在编辑错误行。