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 C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [Aporte-C][Avance] Instrucciones de la VM con ejemplo
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Aporte-C][Avance] Instrucciones de la VM con ejemplo  (Leído 1,437 veces)
Miky Gonzalez

Desconectado Desconectado

Mensajes: 87

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


Ver Perfil WWW
[Aporte-C][Avance] Instrucciones de la VM con ejemplo
« en: 8 Septiembre 2013, 19:26 pm »

Llevo ya desarroyando una máquina virtual largo tiempo, pero no tengo mucho tiempo, estoy con otros proyectos más importantes. Las funciones actuales (no creo que implemente alguna función más, sólo características y ampliaciones):



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
0x06pushlponer en pila un valor inmediato
0x07pushrponer en pila valor de un registro
0x08popeliminar 'cima de pila' (tos)
0x09loadtalmacenar valor retorno de pop en acumulador
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 ( > )


No es un juego de instrucciones completo ni facil de usar, pero teoricamente cualquier otra operación se puede hacer con esas instrucciones, de echo, hice una operación de multiplicar dos números (30 * 3):

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

A la hora de ser compilado para la máquina virtual, queda una matriz como:
Código
  1. char codigo[] = {
  2. 0x01, 0x0A, 0x03, 0x00, 0x01,0x03, 0x03, 0x01, 0x01, 0x00,
  3. 0x02, 0x01, 0x05, 0x03, 0x01, 0x0A, 0x00, 0x0D, 0x29,
  4. 0x01, 0x0A, 0x03, 0x00, 0x02, 0x02, 0x04, 0x03, 0x02, 0x02,
  5. 0x00, 0x05, 0x03, 0x00, 0x01, 0x00, 0x0B, 0x00, 0x0D, 23,
  6. 0x0C, 10, 0x01, 0x00, 0x03, 0x01, 0x00};

Cuya alternativa en código C:
Código
  1. int num1, num2 = 3;
  2. int mult = 0;
  3.  
  4. for (; num2 > 0; num2--) {
  5. for(num1 = 10; num1 > 0; num1--) {
  6. mult++;
  7. }
  8. }



Pueden si quieres crear sus propios algoritmos y postearlos en este mensaje, me ayudaría mucho, estoy intentando implementar "funciones externas", un archivo que incluya funciones para simplificar el trabajo. Esto es una multiplicación simple, seguramente se puede hacer optimizable y/o más corta, cualquier código que quieran crear utilizando esas funciones me ayudaria para probar la máquina virtual.

En aproximadamente 2 semanas espero publicar el código fuente completo... no me gusta sacar 100 versiones para una aplicacion!

Saludos


« Última modificación: 8 Septiembre 2013, 19:30 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
Khronos14


Desconectado Desconectado

Mensajes: 443


A lie is a lie


Ver Perfil WWW
Re: [Aporte-C][Avance] Instrucciones de la VM con ejemplo
« Respuesta #1 en: 8 Septiembre 2013, 20:35 pm »

Puedes coger ideas de mi Máquina Virtual del procesador MIPS y un pequeño ensamblador que hice:

http://mipsvirtualmachine.wordpress.com/
https://github.com/tanisperez/MIPS-Virtual-Machine

Saludos.


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
pequeño aporte(proxy),pero aporte al fin.:D
Programación Visual Basic
Tengu 0 2,419 Último mensaje 22 Julio 2007, 17:33 pm
por Tengu
Separar instrucciones, pausa entre instrucciones
Java
NelxoN 5 7,069 Último mensaje 28 Marzo 2009, 18:24 pm
por Amerikano|Cls
Avance del juego ahorcado (C++)
Programación C/C++
Danyel_Casvill 0 1,728 Último mensaje 26 Abril 2013, 02:48 am
por Danyel_Casvill
[APORTE] Ejemplo de un LL-Hook para el Mouse.
.NET (C#, VB.NET, ASP)
Eleкtro 7 4,021 Último mensaje 26 Septiembre 2014, 16:41 pm
por Eleкtro
[Aporte] Como usar MySQL en NodeJs (Codigo de ejemplo)
Desarrollo Web
[u]nsigned 4 3,921 Último mensaje 20 Mayo 2020, 07:46 am
por [u]nsigned
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines