为什么编译时代码只显示一些白线?

问题描述 投票:0回答:1
.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>_ )。

assembly x86-16 emu8086
1个回答
0
投票

或者我看到黑屏,上面有一个闪烁的破折号,上面写着 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
?以后你就不再使用它了。
DIBUJAR_LINEA循环只是
REP STOSB
,就像你在其他过程中使用的一样。

© www.soinside.com 2019 - 2024. All rights reserved.