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

 

 


Tema destacado: Tutorial básico de Quickjs


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [Opiniones] Máquina virtual
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Opiniones] Máquina virtual  (Leído 1,927 veces)
Miky Gonzalez

Desconectado Desconectado

Mensajes: 87

http://mikygonzalez.comule.com/blog/


Ver Perfil WWW
[Opiniones] Máquina virtual
« en: 17 Septiembre 2013, 22:45 pm »

Especificaciones de la máquina virtual:

El CPU virtual consta de varios registros:
4 registros utilizables a modo usuario, el registro acumulador (*), puntero de instrucción, memoria de código y memoria de datos y un último registro de tamaño byte usado para establecer comparaciones.

La memoria de datos, los 4 registros de usuario y el registro acumulador son de tipo short int, esto quiere decir que pueden alcanzar valores desde 0x0000 hasta 0xFFFF, menos la memoria, que alcanza valores desde 0x1000 hasta 0x2000 (esto son 4kB).

La memoria de datos está programada para en un futuro poder utilizar varias en una misma CPU usadas como "módulos". Para utilizarla un ejemplo podría ser:
putl 1001 BB (guardar en posicion 1 valor 0xBB).
Es posible que en un futuro se junten las dos memorias (memoria de código y memoria de datos).



Set de instrucciones:
0x00haltdetiene el cpu
0x01litcargar en acumulador un valor inmediato
0x02loadcargar en acumulador valor de un registro
0x03storealmacenar valor acumulador en un registro
0x04incincrementar por 1 el acumulador
0x05decdecrementar por 1 el acumulador
0x06putlponer en memoria un valor inmediato
0x07putrponer en registro un valor de memoria
0x08getacargar en acumulador un valor de memoria
0x09getrcargar en registro un valor de memoria
0x0Acmplcomparar acumulador con valor inmediado. establece flag
0x0Bcmprcomparar acumulador con valor registro. establece flag
0x0Cjmpsaltar a direccion de codigo (inicio == 0x00)
0x0Djmplsaltar a direccion de codigo si flag == 1 ( < )
0x0Ejmpesaltar a direccion de codigo si flag == 2 ( = )
0x0Fjmpg    saltar a direccion de codigo si flag == 3 ( > )


Programas de ejemplos (con sus opcodes)

Código
  1. #========================================
  2. # CALCULAR RESTA DE DOS NUMEROS
  3. #========================================
  4. # Usando 2 registros se pueden hacer
  5. # funciones de resta de números.
  6. # resultado: r0
  7. #========================================
  8.  
  9. # Inicializacion de los datos
  10.  
  11. lit 25 # ac: 25
  12. store r0 # r0: 25
  13. lit 17 # ac: 17
  14. store r1 # r1: 17
  15. lit 0 # ac: 0
  16.  
  17. # Bucles
  18.  
  19. load r1 # ac: r1
  20. dec # ac: ac--
  21. store r1 # r1: ac
  22. load r0 # ac: r0
  23. dec # ac: ac--
  24. store r0 # r0: ac
  25.  
  26. lit 1 # ac: 1
  27. cmpr r1 # comparar ac & r1
  28. jmpg 16 # ac > r1 --> jmp 16
  29. jmp 6 # jmp 6
  30.  
  31. halt # stop

Código
  1. char codigo[] = {0x01, 25, 0x03, 0x00, 0x01,
  2.   17, 0x03, 0x01, 0x01, 0x00,
  3.   0x02, 0x01, 0x05, 0x03, 0x01,
  4.   0x02, 0x00, 0x05, 0x03, 0x00,
  5.   0x01, 0x01, 0x0B, 0x01, 0x0F,
  6.   28, 0x0C, 10, 0x00};

Código
  1. #========================================
  2. # CALCULAR SUMA DE DOS NUMEROS
  3. #========================================
  4. # Usando 2 registros se pueden hacer
  5. # funciones de suma de números.
  6. # resultado: r0
  7. #========================================
  8.  
  9. # Inicializacion de los datos
  10.  
  11. lit 17 # ac: 17
  12. store r0 # r0: 17
  13. lit 25 # ac: 25
  14. store r1 # r1: 25
  15. lit 0 # ac: 0
  16.  
  17. # Bucles
  18.  
  19. load r1 # ac: r1
  20. dec # ac: ac--
  21. store r1 # r1: ac
  22. load r0 # ac: r0
  23. inc # ac: ac++
  24. store r0 # r0: ac
  25.  
  26. lit 1 # ac: 1
  27. cmpr r1 # comparar ac & r1
  28. jmpg 16 # ac > r1 --> jmp 16
  29. jmp 6 # jmp 6
  30.  
  31. halt # stop

Código
  1. char codigo[] = {0x01, 17, 0x03, 0x00, 0x01,
  2.   25, 0x03, 0x01, 0x01, 0x00,
  3.   0x02, 0x01, 0x05, 0x03, 0x01,
  4.   0x02, 0x00, 0x04, 0x03, 0x00,
  5.   0x01, 0x01, 0x0B, 0x01, 0x0F,
  6.   28, 0x0C, 10, 0x00};

Código
  1. #========================================
  2. # CALCULAR MULTIPLICACION DE DOS NUMEROS
  3. #========================================
  4. # Utilizando 3 registros (incluso menos) se
  5. # pueden hacer funciones de multiplicación
  6. # de números.
  7. # resultado: r2.
  8. #========================================
  9.  
  10. # Inicialización de los datos
  11.  
  12. lit 10 # ac: 10
  13. store r0 # r0: 10
  14. lit 3 # ac: 3
  15. store r1 # r1: 3
  16. lit 0 # ac: 0
  17.  
  18.  
  19. # Bucles
  20.  
  21. load r1 # ac: r1
  22. dec # ac: ac--
  23. store r1 # r1: ac
  24. cmpl 0 # comparar ac & 0
  25. jmpe 23 # ac == 0 --> jmp 23
  26.  
  27. lit 10 # ac: 10
  28. store r0 # r0: 10
  29.  
  30. load r2 # ac: r2
  31. inc # ac: ac++
  32. store r2 # r2: ac
  33. load r0 # ac: r0
  34. dec # ac: ac--
  35. store r0 # r0: ac
  36. lit 0 # ac: 0
  37. cmpr r0 # comparar ac & r0
  38. jmpl 13 # ac < r0 --> jmp 13
  39. jmp 6 # jmp 6
  40.  
  41. lit 0 # ac: 0
  42. store r1 # r1: 0
  43.  
  44. halt # stop

Código
  1. char codigo[] = {0x01, 0x0A, 0x03, 0x00, 0x01,
  2.   0x03, 0x03, 0x01, 0x01, 0x00,  
  3.   0x02, 0x01, 0x05, 0x03, 0x01, 0x0A, 0x00,
  4.   0x0D, 0x29,
  5.   0x01, 0x0A, 0x03, 0x00, 0x02, 0x02, 0x04,
  6.   0x03, 0x02, 0x02, 0x00, 0x05, 0x03, 0x00,
  7.   0x01, 0x00, 0x0B, 0x00, 0x0D, 23, 0x0C,
  8.   10, 0x01, 0x00, 0x03, 0x01, 0x00};



Espero opiniones, críticas y sus comentarios


« Última modificación: 17 Septiembre 2013, 22:48 pm por Miky Gonzalez » En línea

Mi blog personal, con información acerca de programación, seguridad, desarrollo y electrónica:


EN CONSTRUCCIÓN
eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: [Opiniones] Máquina virtual
« Respuesta #1 en: 18 Septiembre 2013, 07:15 am »

te has dado cuenta de que este foro concreto es de C / C++ y que tú estás poniendo ensamblador??


En línea

Miky Gonzalez

Desconectado Desconectado

Mensajes: 87

http://mikygonzalez.comule.com/blog/


Ver Perfil WWW
Re: [Opiniones] Máquina virtual
« Respuesta #2 en: 18 Septiembre 2013, 13:56 pm »

Si, lose, pero la máquina virtual está programada en C/C++. Es por ello que quería las opiniones de que funciones servirían mejor, algoritmos de uso... para optimizar el código C.
En línea

Mi blog personal, con información acerca de programación, seguridad, desarrollo y electrónica:


EN CONSTRUCCIÓN
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Virtual Dub Mod - Opiniones
Multimedia
TiFoR 2 2,951 Último mensaje 11 Febrero 2005, 05:55 am
por Songoku
pregunta sobre Maquina virtual-virtual pc
Software
T0rete 4 3,385 Último mensaje 5 Octubre 2011, 16:10 pm
por zosemu
Esta máquina puede inundar Amazon de opiniones falsas (y tú te las tragarías)
Noticias
wolfbcn 0 1,543 Último mensaje 20 Septiembre 2017, 01:55 am
por wolfbcn
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines