2012-04-05 24 views
7

De acuerdo con DCPU specification, la única vez que falla una instrucción SET es si el valor a es un literal.¿Puedes escribir en [PC]?

¿Funcionaría lo siguiente?

SET [PC],0x1000 

Una versión más útil sería la configuración de un desplazamiento de PC, por lo que un bucle infinito bastante extraño sería:

SET [PC+0x2],0x89C3 ; = SUB PC,0x2 
+0

¿Qué es "Especificación DCPU"? Proporcione un enlace si tiene uno. –

+1

@AaronDigulla, http://0x10c.com/doc/dcpu-16.txt – Matt

+1

+1 Oh, cómo me encanta la informática imaginaria :) –

Respuesta

7

Probablemente (= Creo que debería funcionar, pero no lo probé) .

Esto se llama código de "auto modificación" y era bastante común la era de 8 bits debido a a) memoria RAM limitada yb) tamaño de código limitado. Código como ese es muy poderoso pero propenso a errores. Si su base de código crece, esto puede convertirse rápidamente en una pesadilla de mantenimiento.

casos de uso famosas:

  1. Windows 95 utilizan el código como este para construir renderizado de gráficos de código en la pila.
  2. Los virus y troyanos utilizar esto como un vector de ataque (código de escritura en la pila o manipular direcciones de retorno a simluate un JMP)
  3. sentencias switch Simular en el C64
+0

La única diferencia es que Puedo ver que no se puede ejecutar el código en la pila con DCPU, ya que los valores de 'PC' están en un espacio de memoria completamente diferente a la pila/ram, por lo que' SET PC, ### 'no se puede hacer para saltar a la pila. – Matt

+0

@Mat - Puede ejecutar el código en la pila con DCPU. Echa un vistazo a la parte inferior de la especificación DCPU. El volcado de memoria de ese código. – flumpb

+0

@kisplit, Puedes poner el código en la pila, pero ¿cómo saltas? Ese vuelco es solo el código ejecutable. – Matt

4

No hay valor para [PC], así que supongo que debe hacerlo de forma indirecta almacenando la PC en algo que pueda usar como puntero (registro o memoria).

 
     SET A , PC 
     SET [A+3], 0x8dc3 ; SUB PC, 3 (if A can't be changed from outside SUB PC,2 works too.) 
+0

Ese código no funcionaría, ya que la sección de código usa los mismos números que la ram/stack.'A' después de esa declaración evaluaría un número, y luego' [A + 3] 'se referiría a esa posición en la memoria, en lugar de a la sección de códigos. – Matt

+1

@Mat - No hay secciones separadas. Puede escribir código de auto modificación con DCPU. – flumpb

Cuestiones relacionadas