sexta-feira, 26 de maio de 2017

Curso de Assembly Aula 26





+---------------+
¦ ASSEMBLY XXVI ¦
+---------------+

    Vistos os três  primeiros  modos  de  escrita  da placa VGA, nos
resta apenas o modo 2.  Esse modo  é  muito  útil  para  escrita  de
bitmaps  nos modos de vídeo de 16 cores...  Ele trabalha basicamente
como o  registro  Set/Reset,  sem  que  tenhamos  que  manusear esse
registro explicitamente.


    ¦ O modo de escrita 2

    Uma vez setado, o modo de escrita 2  habilita  todos  os  quatro
bits  de "Enable Set/Reset", da mesma forma que o modo de escrita 3.
No entanto, diferente do modo de escrita 3, o registro Set/Reset näo
precisa ser ajustado com  a  "cor"  desejada.  Neste modo o registro
Set/Reset é setado com os quatro bits menos significativos  enviados
pela  CPU  à  memória do sistema.  Precisaremos mascarar os bits näo
desejados em BitMask, bem como  ajustar  os planos de bits desejados
em MapMask.

    Repare na força  deste  modo  de  vídeo...  poderemos  atualizar
pixels  com a "cor" que quisermos sem usarmos Set/Reset diretamente,
e sem termos que setar os  bits de "Enable Set/Reset".  Mas, teremos
que ajustar BitMask para näo setarmos todos os oito pixels  no  byte
que estamos escrevendo dos planos de bits...  Eis um exemplo do modo
de escrita 2:

 +-----------------------------------------------------------------+
 ¦  ideal                                                          ¦
 ¦  model tiny                                                     ¦
 ¦  locals                                                         ¦
 ¦  jumps                                                          ¦
 ¦                                                                 ¦
 ¦  include "vga.inc"                                              ¦
 ¦                                                                 ¦
 ¦  LINE_LENGTH     equ     80                                     ¦
 ¦                                                                 ¦
 ¦  codeseg                                                        ¦
 ¦  org     100h                                                   ¦
 ¦  start:                                                         ¦
 ¦      mov     ax,12h  ; Ajusta modo de vídeo 640x480x16          ¦
 ¦      int     10h                                                ¦
 ¦                                                                 ¦
 ¦      WriteMode   2      ; modo de escrita 2                     ¦
 ¦      MapMask     1111b  ; todos os planos de bits               ¦
 ¦                                                                 ¦
 ¦      mov     ax,0A000h                                          ¦
 ¦      mov     es,ax      ; ES = segmento de vídeo                ¦
 ¦                                                                 ¦
 ¦      sub     di,di      ; DI = offset                           ¦
 ¦      sub     bl,bl      ; usaremos BL p/ contar as linhas.      ¦
 ¦                                                                 ¦
 ¦      mov     ah,10000000b ; ah = bitmask inicial                ¦
 ¦      mov     cl,1000b     ; CL = cor inicial                    ¦
 ¦                                                                 ¦
 ¦  @@1:                                                           ¦
 ¦      BitMask ah                                                 ¦
 ¦      mov     al,[es:di]  ; carrega latches                      ¦
 ¦      mov     [es:di],cl  ; escreve nos planos                   ¦
 ¦      ror     ah,1        ; rotaciona bitmask                    ¦
 ¦      inc     cl          ; próxima cor                          ¦
 ¦      cmp     cl,10000b   ; ops... ultrapassou?!                 ¦
 ¦      jb      @@1         ; näo... entäo permanece no loop.      ¦
 ¦      mov     cl,1000b    ; ajusta p/ cor inicial.               ¦
 ¦      add     di,LINE_LENGTH ; próxima linha                     ¦
 ¦      inc     bl          ; incrementa contador de linhas        ¦
 ¦      cmp     bl,8        ; chegou na linha 8?                   ¦
 ¦      jb      @@1         ; näo... continua no loop.             ¦
 ¦                                                                 ¦
 ¦      sub     ah,ah       ; espera tecla, senäo näo tem graça!   ¦
 ¦      int     16h                                                ¦
 ¦                                                                 ¦
 ¦      mov     ax,3        ; volta ao modo texto...               ¦
 ¦      int     10h                                                ¦
 ¦                                                                 ¦
 ¦      int     20h         ; fim do programa.                     ¦
 ¦  end start                                                      ¦
 +-----------------------------------------------------------------+

    Esse modo parece mais fácil  que os demais, näo?!  Aparentemente
é... mas tenha em mente que os outros modos de  escrita  também  têm
suas vantagens.


    ¦ E os modos de leitura?!

    Na  grande maioria das vezes näo é vantajoso lermos os dados que
estäo nos planos de bits...  Isso  porque  a memória de vídeo é mais
lenta que a memória do sistema (mesmo a memória do sistema associada
à placa VGA é mais lenta que o resto da memória  do  seu  PC...  por
causa  dos WAIT STATES que a placa VGA adiciona para näo se perder -
a velocidade da CPU é maior  que  a  do circuito de vídeo!).

    Para  encerrarmos  os  modos  de  16 cores é interessante vermos
alguma coisa sobre o modo  de  leitura  0,  que  é o modo default da
placa VGA.

    No modo de leitura 0 devemos ler um plano de bits por vez... näo
é possível ler mais que um plano ao mesmo tempo... e ainda,  MapMask
näo é responsável pela habilitaçäo dos planos de bits.  Nesse caso a
leitura é feita através de uma ramificaçäo do circuito de vídeo... a
escrita é feita por  outra.   O  registrador  BitMask também näo tem
nenhum efeito na leitura.  Por isso a seleçäo dos bits fica por  sua
conta (através de instruçöes AND).

    A  seleçäo  do  plano  de  bits  que  será  lido  é  feito  pelo
registrador ReadMap que é descrito abaixo:

        » Registrador READMAP

                7 6 5 4 3 2 1 0
               +-Ð-Ð-Ð-Ð-Ð-Ð-Ð-+
               ¦?¦?¦?¦?¦?¦?¦ ¦ ¦
               +-¤-¤-¤-¤-¤-¤-¤-+
                            ¦ ¦
                            +------- Seleçäo do plano de bits

    ReadMap  também  faz  parte do circuito GC...  Entäo é acessível
via endereços de I/O 3CEh  e  3CFh,  da  mesma forma que BitMask e o
registro de MODE, só que seu índice é 4.

    Uma nota importante é a de que, embora a leitura seja feita  por
uma ramificaçäo diferente (por isso a existência de ReadMap), quando
fazemos   uma   leitura   dos   planos   de  bits,  os  latches  säo
automaticamente carregados... e  os  latches pertencem à ramificaçäo
do  circuito  de escrita (somente os latches dos planos selecionados
por MapMask säo carregados, lembra?!).

    E zé fini... pelo menos até o próximo texto! :)

Nenhum comentário:

Postar um comentário

Curso SANS 504 Hacker Techniques, Exploits & Incident Handling

SANS SECURITY 504 - Hacker Techniques, Exploits & Incident Handling     SANS Security 504.5.pdf13 MB     SANS Security 504.1.pdf12 M...