.MODEL SMALL
.STACK 100h
.DATA
COLUMNA DW ?
FILA DW ?
AVANCEH DW ?
AVANCEV DW ?
.CODE
DETENER_POR_TIEMPO PROC
MOV CX, 2000h
MOV DX, 2000h
MOV BX, 2000h
NOP
RET
DETENER_POR_TIEMPO ENDP
DIBUJARRECTANGULOGRIS PROC
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV AX, 0A000h ; Segmento de la memoria de video
MOV ES, AX
MOV DI, COLUMNA ; Columna inicial
MOV AX, FILA ; Fila inicial
MOV BX, AVANCEH ; Ancho del rectángulo
MOV CX, AVANCEV ; Alto del rectángulo
MOV DX, BX ; Ancho
MOV BX, CX ; Alto
MOV AL, 8 ; Color gris
DIBUJAR_FILA:
MOV CX, DX ; Restaura CX al ancho inicial
REP STOSB ; Dibuja una fila de píxeles
ADD DI, 320 ; Avanza a la siguiente fila en la memoria de video
DEC BX ; Decrementa el alto
JNZ DIBUJAR_FILA
POP DX
POP CX
POP BX
POP AX
RET
DIBUJARRECTANGULOGRIS ENDP
DIBUJARCIRCULONEGRO PROC
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV AX, 0A000h ; Segmento de la memoria de video
MOV ES, AX
MOV DI, COLUMNA ; Columna inicial
MOV AX, FILA ; Fila inicial
MOV BX, AVANCEH ; Radio horizontal del círculo
MOV CX, AVANCEV ; Radio vertical del círculo
MOV DX, BX ; Radio horizontal
MOV BX, CX ; Radio vertical
MOV AL, 1 ; Color negro
DIBUJAR_CIRCULO:
MOV CX, DX ; Restaura CX al radio horizontal
REP STOSB ; Dibuja una fila de píxeles
ADD DI, 320 ; Avanza a la siguiente fila en la memoria de video
DEC BX ; Decrementa el radio vertical
JNZ DIBUJAR_CIRCULO
POP DX
POP CX
POP BX
POP AX
RET
DIBUJARCIRCULONEGRO ENDP
DIBUJARTRIANGULODORADO PROC
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV AX, 0A000h ; Segmento de la memoria de video
MOV ES, AX
MOV DI, COLUMNA ; Columna inicial
MOV AX, FILA ; Fila inicial
MOV BX, AVANCEH ; Base del triángulo
MOV CX, AVANCEV ; Altura del triángulo
MOV DX, BX ; Base
MOV BX, CX ; Altura
MOV AL, 14h ; Color dorado
DIBUJAR_LINEAS:
MOV CX, DX ; Restaura CX a la base del triángulo
MOV DH, 0
DIBUJAR_LINEA:
MOV AL, 14h ; Color dorado
STOSB ; Dibuja un píxel
INC DI ; Avanza al siguiente píxel en la memoria de video
LOOP DIBUJAR_LINEA
ADD DI, 320 ; Salta a la siguiente fila en la memoria de video
DEC BX ; Decrementa la altura
JNZ DIBUJAR_LINEAS
POP DX
POP CX
POP BX
POP AX
RET
DIBUJARTRIANGULODORADO ENDP
INICIO:
MOV AX, @data
MOV DS, AX
MOV AX, 13h ; Cambiar a modo gráfico 320x200
INT 10h
MOV COLUMNA, 120
MOV FILA, 100
MOV AVANCEH, 100
MOV AVANCEV, 150
CALL DIBUJARRECTANGULOGRIS
; CALL DETENER_POR_TIEMPO
MOV COLUMNA, 180
MOV FILA, 175
MOV AVANCEH, 5
MOV AVANCEV, 5
CALL DIBUJARCIRCULONEGRO
; CALL DETENER_POR_TIEMPO
MOV COLUMNA, 150
MOV FILA, 160
MOV AVANCEH, 20
MOV AVANCEV, 20
CALL DIBUJARTRIANGULODORADO
; CALL DETENER_POR_TIEMPO
MOV AX, 3 ; Regresar al modo de texto
INT 10h
MOV AX, 4C00h ; Salir del programa
INT 21h
END INICIO
因为代码在 DOSBox 中编译时只显示一些白线。我在 DOSBox 中编译它,它显示了一些白线。我希望它能向我显示带有锁的门的图像,我在 emu8086 中尝试了它,它只编译了顶部部分变成灰色(或者我得到一个黑屏,上面有一个闪烁的破折号,上面写着 C:\TASM>_ )。
或者我看到黑屏,上面有一个闪烁的破折号,上面写着 C:\TASM>_
这个最容易解决!您执行“Regresar al modo de texto”的代码
MOV AX, 3
INT 10h
来得太快了。通过引入暂停(例如等待击键),让自己有机会在屏幕上看到实际输出:
mov ah, 00h ; BIOS.GetKeystroke
int 16h ; -> AX
mov ax, 0003h ; BIOS.SetVideomode
int 10h
虽然 DIBUJARRECTANGULOGRIS、DIBUJARCIRCULONEGRO 和 DIBUJARTRIANGULODORADO 等名称建议绘制一个矩形、一个圆形和一个三角形,但我只看到绘制一些矩形表面的努力。毫无疑问,这是一项正在进行的工作。
但为什么that失败了?
所有矩形都从屏幕顶部开始。
您不使用 FILA 参数,并且看到您的 COLUMNA 参数是 X 坐标,我希望 FILA 是您的 Y 坐标。然后计算必须将 Y 乘以 320 并加上 X:
移动斧头,320 穆尔 FILA ;是 添加斧头,柱 mov di,斧子
所有矩形都倾斜了。
您在屏幕上绘制的线条必须全部从同一 X 坐标开始。因此,
add di, 320
必须在 DI 指向起始像素的情况下执行。这里一个简单的解决方案是将 DI 保留在堆栈上:
推迪 代表斯托布 流行迪 加迪,320
MOV CX, DX ; Restaura CX a la base del triángulo MOV DH, 0 DIBUJAR_LINEA: MOV AL, 14h ; Color dorado STOSB ; Dibuja un píxel INC DI ; Avanza al siguiente píxel en la memoria de video LOOP DIBUJAR_LINEA
你为什么写
MOV DH, 0
?以后你就不再使用它了。REP STOSB
,就像你在其他过程中使用的一样。