elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  ASM (Moderador: Eternal Idol)
| | | |-+  Consulta sobre VESA y directiva: "virtual" (pasar de FASM a NASM)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Consulta sobre VESA y directiva: "virtual" (pasar de FASM a NASM)  (Leído 5,196 veces)
Vaagish


Desconectado Desconectado

Mensajes: 875



Ver Perfil
Consulta sobre VESA y directiva: "virtual" (pasar de FASM a NASM)
« en: 12 Febrero 2015, 19:55 pm »

Hola! Hace tiempo no pasaba por estos lados..

Estoy revisando el código de KolibriOS, mas específicamente la parte de video, y me encuentro con esto:

Código
  1. struc VBE_VGAInfo {
  2.  .VESASignature          dd ?    ; char
  3.  .VESAVersion            dw ?    ; short
  4.  .OemStringPtr           dd ?    ; char *
  5.  .Capabilities           dd ?    ; ulong
  6.  .VideoModePtr           dd ?    ; ulong
  7.  .TotalMemory            dw ?    ; short
  8.  ; VBE 2.0+
  9.  .OemSoftwareRev         db ?    ; short
  10.  .OemVendorNamePtr       dw ?    ; char *
  11.  .OemProductNamePtr      dw ?    ; char *
  12.  .OemProductRevPtr       dw ?    ; char *
  13.  .reserved               rb 222  ; char
  14.  .OemData                rb 256  ; char
  15. }
  16.  
  17. struc VBE_ModeInfo {
  18.  .ModeAttributes         dw ?    ; short
  19.  .WinAAttributes         db ?    ; char
  20.  .WinBAttributes         db ?    ; char
  21.  .WinGranularity         dw ?    ; short
  22. ... ; MUCHOS CAMPOS MAS, LOS RECORTO PARA AHORRAR ESPACIO
  23.  .LinRsvdFieldPosition   db ?    ; char
  24.  .MaxPixelClock          dd ?    ; ulong
  25.  .res2                   rb 190  ; char
  26. }
  27.  
  28. virtual at $A000
  29.  vi VBE_VGAInfo
  30.  mi VBE_ModeInfo
  31. modes_table:
  32. end virtual

El problema es que kolibri esta ensamblado en FASM (donde existe esa directiva virtual at XXXX), ya vi como funciona "virtual", pero no me doy cuenta como pasarlo a NASM, yo uso la estructura asi:

Código
  1. ; =========================== NASM VESA INFORMATION BLOCK ===========================
  2. VESA_Info:
  3. .Signature              db      4      ; VBE Signature
  4. .Version                dw      1      ; VBE Version
  5. .OEMStringPtr           dd      1      ; VbeFarPtr to OEM String
  6. .capabilities           db      4      ; Capabilities of graphics controller
  7. .VideoModePtr           dd      1      ; VbeFarPtr to VideoModeList
  8. .TotalMemory            dw      1      ; Number of 64kb memory blocks
  9. .OEMSoftwareRev         dw      1      ; VBE implementation Software revision
  10. .OEMVendorNamePtr       dd      1      ; VbeFarPtr to Vendor Name String
  11. .OEMProductNamePtr      dd      1      ; VbeFarPtr to Product Name String
  12. .OEMProductRevPtr       dd      1      ; VbeFarPtr to Product Revision String
  13. .Reserved               db      222    ; Reserved for VBE implementation scratch area
  14. .OEMData           db      255    ; Data Area for OEM Strings
  15. ; .OEMData db      256    ; Data Area for OEM Strings
  16.  
  17. ; ============================== VESA MODE INFORMATION ==============================
  18. Mode_Info:
  19. .ModeAttributes         dw      1      ; mode attributes
  20. .WinAAttributes         db      1      ; window A attributes
  21. .WinBAttributes         db      1      ; window B attributes
  22. .WinGranularity         dw      1      ; window granularity
  23. ... ; CAMPOS OCULTOS
  24. .LinRsvdFieldPos        db      1      ; bit position of lsb of reserved mask (linear modes)
  25. .MaxPixelClock          dd      1      ; maximum pixel clock (in Hz) for graphics mode
  26. .Reserved               db      190    ; remainder of ModeInfoBlock
  27. ; ******************************************************************************************

Bueno, y quiero acceder asi:

Código
  1. ; =================================================
  2. ; Display Vesa version
  3. ; =================================================
  4. VESAVER:
  5. mov ax, 0x4f00 ; VESA BIOS function (get BIOS info, if function available)
  6. mov di, VESA_Info ; mov di, 0xA000
  7. int 0x10
  8.  
  9. cmp  ax, 0x004f ; OK?
  10. je   vesa
  11. jmp  novesaver
  12.  
  13. vesa:
  14. mov  ax, [es:di+4] ; AH = major, AL = minor version
  15. ; mov  dx, ax ; ???
  16. add  ax, 48*256+48 ; convert to ASCII
  17. mov  [vervesa+19], ah ; replace x.x in string with numbers
  18. mov  [vervesa+21], al ; update offsets if string is modified
  19. mov  si, vervesa ; Print Vesa version
  20. call print16
  21. ret
  22.  
  23. novesaver:
  24. mov  si, novesa
  25. call print16
  26. ret
  27. ; ************* END VESAVER *************

Eso funciona, pero hasta ahi.. no puedo mostrar ningun campo mas,, queria mostrar por ejemplo (codigo de Kolibri):

Código
  1. mov  si,word[es:vi.OemStringPtr]
  2. mov  di,si
  3.  
  4. push ds
  5. mov  ds,word[es:vi.OemStringPtr+2]
  6. call printplain
  7. pop  ds

NOTA: printplain es casi igual a mi print16, es la funcion 0eh - int 10h
NOTA2: Notese que usa "vi" y eso lo declara en virtual, en NASM no tengo eso..


Bueno, espero no haber enredado mucho el asunto y que se entienda.. Gracias por leer y de antemano por la ayuda!

Saludos!


En línea

_Enko


Desconectado Desconectado

Mensajes: 538



Ver Perfil WWW
Re: Consulta sobre VESA y directiva: "virtual" (pasar de FASM a NASM)
« Respuesta #1 en: 13 Febrero 2015, 22:25 pm »

No puedes hacer en nasma algo asi?

Código
  1. mov esi, 0x0A00
  2. mov [esi + VBE_VGAInfo.VESASignature], 1234
  3.  


Saludos.


En línea

Vaagish


Desconectado Desconectado

Mensajes: 875



Ver Perfil
Re: Consulta sobre VESA y directiva: "virtual" (pasar de FASM a NASM)
« Respuesta #2 en: 14 Febrero 2015, 14:01 pm »

Hola! Gracias por responder _Enko!

No funciono de esa forma (aunque es probable que no lo haya implementado bien), voy a poner el codigo como va quedando, a ver si alguien mas despierto que yo ve como arreglarlo  :xD

Código
  1. ; ***************************
  2. ;   Mapa de memoria
  3. [map all MEMMAP.map]
  4. ; ***************************
  5.  
  6. [ORG 0]
  7. [BITS 16]
  8.  
  9. jmp 07C0h:start
  10.  
  11. novesamsg db "No vesa found", 13, 10, 0
  12. vervesa db "Version of Vesa: Vesa x.x", 13, 10, 0
  13.  
  14. print:
  15.    lodsb           ; AL = memory contents at DS:SI
  16. or al, al ; Comprobar fin de cadena
  17. jz end ; ...
  18.    mov ah, 0Eh     ; Funcion 14 (Imprimir caracter Monotype)
  19. mov bl, 0Ah ; Color de fuente verde
  20.    int 10h ; Interrupt
  21.    jmp print       ; Loop
  22. end:
  23. ret
  24.  
  25. ; ****************************
  26. ; Realmode startup code.
  27. ; ****************************
  28. start:
  29.  
  30. ; STACK
  31. mov ax, cs ; Update the segment registers
  32. mov ds, ax ; ''
  33. mov es, ax ; ''
  34.  
  35. ; VGA
  36. mov ax, 0012h ; Funcion 00 (Modo de video) - Modo Grafico (16 Colores, 640 * 480)
  37. int 10h
  38.  
  39. ; **********************************************************************
  40. ; VESA
  41. ; INT 10 - VESA SuperVGA BIOS - GET SuperVGA INFORMATION
  42. ; Nota: Field "Signature" must be set to "VBE2" before the call to fill
  43. ; **********************************************************************
  44.  
  45. mov dword [VbeInfoBlock.Signature], 'VBE2'
  46. mov ax, 4F00h                        
  47. mov di, VbeInfoBlock
  48. int 10h
  49.  
  50. cmp ax, 004Fh ; Si todo sale bien, la estructura VbeInfoBlock deberia tener info
  51. jne novesa                       ; Nop..
  52.  
  53. mov  ax, [VbeInfoBlock+4] ; AH = major, AL = minor version
  54. add  ax, 48*256+48 ; convert to ASCII
  55. mov  [vervesa+22], ah ; replace x.x in string with numbers
  56. mov  [vervesa+24], al ; update offsets if string is modified
  57.  
  58. mov  si, vervesa
  59. call print
  60.  
  61. jmp $    ; FOR DEBUG ONLY
  62.  
  63. mov bx, 4112h ; 112h - 640x480 16.8M (8:8:8)
  64. mov di, Mode_Info
  65. mov cx, bx
  66. mov ax, 4F01h ; INT 10 - VESA SuperVGA BIOS - GET SuperVGA MODE INFORMATION
  67. int 10h
  68.  
  69. mov ax, 4F02h ; INT 10 - VESA SuperVGA BIOS - SET SuperVGA VIDEO MODE
  70. int 10h
  71. jmp fine
  72.  
  73. novesa:
  74. mov si, novesamsg
  75. call print
  76. jmp $ ; PAUSA ACA! Abort!
  77.  
  78. ; *****************************
  79. ; Setting up, to enter pmode.
  80. ; *****************************
  81. fine:
  82. cli
  83. lgdt [gdtr]
  84.  
  85. mov eax, cr0
  86. or  al, 0x1
  87. mov cr0, eax
  88.  
  89. jmp 0x10:Protected
  90.  
  91. %include "VESA.inc"
  92.  
  93. ; *******************************
  94. ; Protected (Bits 32)
  95. ; *******************************
  96.  
  97. [BITS 32]
  98. Protected:
  99. ; etc,, etc..

Una cosa curiosa que pasa en el codigo ahora es que en la linea 53 si la dejo como esta funciona,, pero si pongo:

Código
  1. mov  ax, [VbeInfoBlock.Version]


ya no funciona, cuando a mi entender deberia ser lo mismo..  :rolleyes:

Eso me dice que probablemente la estructura no tenga los datos que deberia tener, pero sin embargo cuando comparo en la linea 50:

Código
  1. cmp ax, 004Fh

es como que todo salio bien.. no se..

Gracias por el tiempo!

Saludos!

PD: Alguien sabe si existe una buena, buena forma de depurar esto? Algo asi como ir viendo los cambios en hexa, en tiempo real? Un debuger attacheado,, o algo asi? Pero que sea bueno de verdad y grafico.. no una consola..  :silbar:

PD2: Ha,, en VESA.inc estan las estructuras necesarias, y la GDT en otro .inc, pero de momento eso va bien,, entra en Modo protegido y funciona..
En línea

Arkangel_0x7C5


Desconectado Desconectado

Mensajes: 361



Ver Perfil
Re: Consulta sobre VESA y directiva: "virtual" (pasar de FASM a NASM)
« Respuesta #3 en: 14 Febrero 2015, 14:16 pm »

yo creo que la directiva que tu quieres es ABSOLUTE
Sobre un debunguer para ver los cambios puedes usar bochs

Saludos
En línea

Vaagish


Desconectado Desconectado

Mensajes: 875



Ver Perfil
Re: Consulta sobre VESA y directiva: "virtual" (pasar de FASM a NASM)
« Respuesta #4 en: 14 Febrero 2015, 14:21 pm »

Gracias Arkangel_0x7C5!

Voy a probar esa directiva, no la conozco, por otra parte, uso bochs si.. pero como podria ver los cambios en las direcciones de memoria X?

EJ: Quiero ver cuando se rellene la estructura VbeInfoBlock, en tiempo real,, o bueno, enseguida despues de llamar la funcion que la rellena..  :rolleyes:

Saludos! Gracias!

Edit: Mmm.. es probable que tenga que declarar los campos asi: resd, resb... no?
« Última modificación: 14 Febrero 2015, 14:27 pm por Vaagish » En línea

Arkangel_0x7C5


Desconectado Desconectado

Mensajes: 361



Ver Perfil
Re: Consulta sobre VESA y directiva: "virtual" (pasar de FASM a NASM)
« Respuesta #5 en: 14 Febrero 2015, 15:43 pm »

Claro que tienes que declarar los campos, esa directiva solo hace que la etiqueta que declaras, empiece en esa direccion

Ese emulador permite la depuracion y tiene una interface grafica.
Si quieres ver lo que sucede antes y despues de una funcion, tendras que poner un punto de interrupcion

http://wiki.osdev.org/Bochs

Saludos
En línea

Vaagish


Desconectado Desconectado

Mensajes: 875



Ver Perfil
Re: Consulta sobre VESA y directiva: "virtual" (pasar de FASM a NASM)
« Respuesta #6 en: 15 Febrero 2015, 18:29 pm »

Citar
Ese emulador permite la depuracion y tiene una interface grafica.

Si, yo usaba la depuracion pero por linea de comandos, los break y todo lo demas, pero es medio rudimentario..

Recién me entero que tiene esa interfaz grafica! He inclusive que se puede usar esto:

Citar

Dejo el link porque es probable que algun dia, a alguien le sirva..

Citar
Claro que tienes que declarar los campos, esa directiva solo hace que la etiqueta que declaras, empiece en esa direccion

Si. lo que queria decir es si los declaraba con db o con resb

Gracias Arkangel, me va a ser muy util el dato! Ya vere mejor que es lo que hace KolibriOS, e intentar reproducirlo en nasm

Gracias!! Saludos!
En línea

Arkangel_0x7C5


Desconectado Desconectado

Mensajes: 361



Ver Perfil
Re: Consulta sobre VESA y directiva: "virtual" (pasar de FASM a NASM)
« Respuesta #7 en: 16 Febrero 2015, 12:59 pm »

Con db pides espacio en el ejecutable, suele ser para variables inicializadas y con resb solo pides el espacio, pero no se guarda en el ejecutable, datos sin inicializar. Por lo tanto necesitas resb

Saludos
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Consulta sobre "cuanta RAM acepta mi placa base" « 1 2 »
Hardware
Skeletron 14 7,901 Último mensaje 28 Septiembre 2010, 04:27 am
por Skeletron
NASM Linux printf - scanf "undefined reference"
ASM
Leyer 5 8,665 Último mensaje 7 Enero 2012, 20:32 pm
por Eternal Idol
Consulta sobre Titulo "Analista Seguridad en Sistemas" - Argentina
Foro Libre
z3roxero 1 1,570 Último mensaje 28 Septiembre 2015, 18:04 pm
por engel lex
¿Qué hay relamente detrás de la directiva de UE que "prohibiría los memes" y ...
Noticias
wolfbcn 0 1,399 Último mensaje 16 Junio 2018, 14:29 pm
por wolfbcn
Socket en Nasm sobre Winx64, no logro que "connect" funcione
ASM
otroWeyMas.nasm 3 5,003 Último mensaje 17 Noviembre 2021, 00:56 am
por Eternal Idol
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines