modo grafico caracteres emu8086 [facil]

  • 1 Respuestas
  • 242 Vistas

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado ErielSinh

  • *
  • Underc0der
  • Mensajes: 11
  • Actividad:
    0%
  • Country: 00
  • Reputación 1
  • The karma is a bitch
    • Ver Perfil

modo grafico caracteres emu8086 [facil]

  • en: Diciembre 09, 2020, 11:47:37 pm
hoy experimentaremos a imprimir en el modo grafico en assembler en emu8086
un ejemplo basico para entender como funciona
Programa para imprimir la letra a en el modo grafico emu8086
Código: [Seleccionar]
; si queremos modificar la direccion de pantalla es B800 contiene 2 bytes
; B800; 2 bytes (Caracter,Color)
org 100h
 mov ax,0b800h; direccionando a memoria de pantalla 0b800h
 mov es,ax; ponemos al segmento extra para poder acceder
 mov es:[0],65; imprimimos el caracter A su valor en codigo ascii es 65 en la memoria de pantalla
ret
ejecutamos en emu

Ahora practiquemos un poco mas
nuestra zona de memoria de la pantalla es lineal, va desde el 1 hasta el 2000 linealmente, cada direccion de memoria se expresa en hexadecimal
tendriamos algo parecido a esto
;   zona de memoria es una especie de matriz o vector linea   0 ---------- 80
                                                                                         81--------- 160
                                  161-------- 240
                                  241-------- 320 (2000 caracteres en total)
ahora para practicar imprimiremos una cadena de caracteres A
Imprimir  caracteres A --------------------->
                               <---------------------A
Código: [Seleccionar]

org 100h     
 mov bx,0
 mov cx,3 ; repetiremos 3 veces a->
                              ; <-a
                             
 mov ax,0b800h; memoria de pantalla 
 
   
   ciclo:  ; este es el ciclo global que imprimira ambas lineas
   
   push cx   
   mov bx,contadord
   mov cx,80; son 80 caracteres por linea que debemos imprimir lo guardamos en cx para repetir 80 veces
   imprimirder:  ; ciclo que imprime a la derecha 
   mov es,ax; movemos al segmento extra
   mov es:[bx],65; imprimimos a en el indice 0
   ;mov es:[bx+320],65   
   ;mov es:[bx+640],65
   add bx,2         
   loop imprimirder
   
   add contadord,320
   pop cx
   push bx
   push cx 
   mov bx,contadori
   mov cx,80   
   
   imprimirizq: ; ciclo que imprime a la izquiera
   mov es:[bx],65
   sub bx,2   
   loop imprimirizq
   
   add contadori,320   
   pop cx
   pop bx
   loop ciclo     
     
ret     
contadord dw 0h ;iniciamos la primera linea en la direccion 0h para que empiece a imprimir desde ahi
contadori dw 318 ;iniciamos en la segunda fila 320-2 si tomamos en cuenta que es una direccion lineal
resta dw 2h ; utilizaremos la variable para el decremento         
viendo su ejecucion en emu8086
el modo de pantalla es de 80*25
entendiendo el funcionamiento cada posicion seria

Para practicar un poco mas, haremos una impresion de caracteres primero hacia abajo y luego hacia arriba
Código: [Seleccionar]
org 100h     
 mov ax,0b800h
 mov es,ax
 ;mov bx,0
 mov cx,3
 
inccolumna: 
 push cx
 push bx   
 mov bx,posicionx
 mov cx,25; repetir 2 veces columna
 
     abajo: 
      mov es:[bx],65
      ;mov es:[bx+1],24h
      add bx,160   
       loop abajo     
 pop bx
 pop cx
  push cx
  push bx
  mov cx, 25
  mov bx,posiciony
   arriba:
    mov es:[bx+2],65
    sub bx,160     
    loop arriba 
  pop bx
  pop cx
   
 add posicionx,4
 add posiciony,4
 loop inccolumna     
ret           
 x dw 0       
 posicionx dw 0h
 posiciony dw 3840
 


como ven lo unico que cambia es el incremento, antes incrementabamos en 1 espacio, ahora añadimos +160 caracteres para imprimir en la siguiente linea, o decrementamos -160 para subir por la memoria de pantalla
movemos en CX el valor de 25 porque solo hay 25 lineas hacia abajo
ejecutemos en emu

ejecutemos

por ultimo les dejo un codigo que imprime las dos filas en direcciones contrarias al mismo tiempo
Código: [Seleccionar]
org 100h     
 mov ax,0b800h
 mov es,ax
 ;mov bx,0
 mov cx,3   
 push ax
 mov ax, posiciony  ;inicializar resto
 mov resto,ax
 pop ax
inccolumnadoble: 
 push cx       
 mov bx,posicionx
 mov cx,25; repetir 2 veces columna
   
     abajo:
      ;mov ax,posiciony
      ; imprimir caracter hacia abajo
      mov es:[bx],65
      ;mov es:[bx+1],24h
      add bx,160
       ; imprimir caracter hacia arriba
       push bx 
       mov bx,resto
       mov es:[bx+2],65
       
       sub resto,160 
       pop bx
       loop abajo       
 pop cx           
 add posicionx,4 ; incrementar posicionx en 4 para siguiente columna
 push ax            ; copiar la direcion de posicionx y aumentar 3840 + 4
 mov ax,posicionx
 mov resto,ax
 pop ax 
 add resto,3840 
 loop inccolumnadoble     
ret           
 x dw 0       
 posicionx dw 0h
 posiciony dw 3840
 resto dw 0

a modo de curiosidad mario bros fue escrito en assembler


                                              


« Última modificación: Diciembre 10, 2020, 01:15:57 am por ErielSinh »

Conectado DtxdF

  • *
  • Moderador Global
  • Mensajes: 916
  • Actividad:
    100%
  • Country: 00
  • Reputación 19
  • Eres un auto y tienes dos opciones: Parar o Seguir
    • Ver Perfil
    • Mi repositorio de Github donde encontraras herramientas para tu trabajo.
    • Email

Re:modo grafico caracteres emu8086

  • en: Diciembre 10, 2020, 12:24:00 am
Excelente aporte. Muchas gracias por compartir ^-^)

~ DtxdF
Los seres humanos son robots, cuyo combustible es el afanado dinero.