Ir al contenido principal

Instalando Granola en Trisquel

Actualización: desde que se escribió esto, cambairon algunas cosas (granola ahora usa licencias comerciales para "orgaizaciones" y cosas así, con lo que desconozco si se puede seguir considerando libre, que no gratuito )

Navengando por Linux_Hispano me encontre con un software que tiene muy buena pinta, Granola, completamente libre (gracias al canal #trisquel por responder esta duda) y dedicado al ahorro de energía. La instalación es bastante simple, el típico shellscript, pero no funciona del todo bien en esta distro, así que hay que hacer un par de apaños, intentando ejecutar el shellscript... [http://1.bp.blogspot.com/_26RJWnubh-w/TC5PZmQGFNI/AAAAAAAAAKk/RVPS7iDyHrk/ s320/Pantallazo.png] "Perdón, pero parece que estas utilizando una distribución o versión sin soporte" Si se busca el string en el script instalador se encuentra esto: [http://4.bp.blogspot.com/_26RJWnubh-w/TC5THVCsdUI/AAAAAAAAAKo/LsZ49f9VB-Y/ s320/Pantallazo-1.png] Así que lo que hay que hacer es que la variable $DISTRIBUTION sea ubuntu o debian (hay más distros soportadas, pero estas son las más similares), solo hay que cambiar.

=============================================================================== DISTRIBUTION=unsupported =============================================================================== por

=============================================================================== DISTRIBUTION=ubuntu ===============================================================================

Y añadir una línea después, dependiendo de la versión de Ubuntu en la que se base, por ejemplo

si es el Trisquel 3.5 CODENAME=karmic

o si es la versión 4 CODENAME=lucid

Para actualizar la lista de software haremos sudo apt-get update

pero da un error: "W: Imposible obtener https://download.miserware.com/liux/deb/dists/taranis/ main/binary-i386/Packages.gz  The requested URL returned error: 404"

Así que hay que editar /etc/apt/sources.list.d/miserware.list , y en deb https://download.miserware.com/linux/deb taranis mainhay que cambiar el codename de la versión (taranis aquí) por la equivalente de ubuntu (la que pusimos en la variable CODENAME en el script de instalación, en este caso lucid)

Ahora el sudo apt-get update debería funcionar bien, así que por fin podemos instalar el software con sudo apt-get install granola granola-gui

[http://1.bp.blogspot.com/_26RJWnubh-w/TC5hbKtcvII/AAAAAAAAAKs/JFbHSdb2pVk/ s320/Pantallazo-2.png] A ver si de paso ahora dura más la batería del portátil :P

Hasta otra!

Bgame (un minijuego de 510 bytes)

Bgame es un juego hecho para probar un concepto, meter un juego en el bootsector de un disquete, y que el PC pueda cargar directamente (sin pasar por un SO)

El resultado es bastante cutre, en parte por la limitacion de 510 bytes ( 512- 2 para el numero magico), que es parte del reto, y en parte por la poca destreza del programador (yop), pero funciona, y sirve de practica sobre ensamblador en modo real, asi que cumplio su funcion :)}

Esta completamente escrito en ensamblador de 16 bits (no hay mas opciones, si tiene que funcionar sin un SO y en ese espacio)... aqui teneis el codigo fuente [bgame.asm] (con los comentarios en ingles), o con los comentarios traducidos [bgame_es.asm] , el makefile [Makefile] y la imagen del disquete generado [bgame.img] y todo en un ZIP [bgame.zip]

La idea es utilizar una maquina virtual, como virtual_box, y cargar la imagen del disquete.

Es posible que interese cambiar un par de variables (nivel y velocidad del juego), esto se puede hacer en dos los primeros del codigo: %define glevel 200       ; Nivel del juego (1-255) (1-0xFF) %define step_speed 0xFF    ; Tiempo por cada "tick" del juego (1-65535) (1- 0xFFFF)

El "juego" es bastante simple, los disparos propios son " | ", los disparos que vienen de arriba son " ! ", y las explosiones (cuando chocan dos cosas), son " @ ", aunque las colisiones no van muy finas, a veces los disparos explotan por que si... pero es mas que nada estetico.

Las capturas, no pueden faltar en esta ocasion: [http://4.bp.blogspot.com/_26RJWnubh-w/S93tpELAatI/AAAAAAAAAF0/UyTZmezMqz4/ s640/Pantallazo.png]

Y cuando pierdes...

[http://3.bp.blogspot.com/_26RJWnubh-w/S93tsMd3oNI/AAAAAAAAAF8/_mvzivnJBjQ/ s640/lose.png]

Y no, no tengo ni idea de que pasara si se mete en un disquete y se bootea (hubo que recortar algo de codigo que hacian comprobaciones necesarias para PC's antiguos)

Por supuesto, aun se pueden hacer algunas mejoras al juego (como eliminar todo el codigo :D)

Hasta la proxima!

[Referencia] osdev.org

Pasando el rato con /dev/dsp

/dev/dsp es el dispositivo que controla el audio en gnu/linux, esto permite hacer cosas bastante curiosas

(Si no encuentras el archivo dsp en la carpeta /dev, quiza este en dsp0, audio o audio0...)

Escribiendo cosas en este archivo conseguiremos que salgan como audio (lo mejor sera bajar el volumen del audio, ya vereis por que... ;)

Otra cosa... es posible que sea necesario cerrar las aplicaciones que esten utilizando el audio para que funcione todo bien, ademas esto es mejor lanzarlo en una consola de comandos (no con un "ejecutar programa") y despues pararlo con Control-C, sino es posible que siga hasta que se reinicie el pc.

Por ejemplo, haciendo  sudo cat /dev/mouse >> /dev/dsp , los altavoces produciran un sonido cada vez que el mouse se mueve.

Con sudo cat /dev/urandom >> /dev/dspse producira un sonido aleatorio... decepcionados?, yo tambien, lo de que fuera aleatorio tenia buena pinta, pero al final es lo que se escucha cuando la radio no esta sintonizada [http:// obusca.webcindario.com/files/smileys/032.gif]

El resto es cuestion de imaginacion, hacer sudo cat /dev/hda >> /dev/dsp (o con sda en vez de hda si el disco es scsi)"reproducira" el disco duro, tambien se puede hacer con un archivo cualquiera, o con /dev/stdin (el teclado), /dev/mem (que es la memoria del pc)...

Tambien se puede hacer al reves, sudo cat /dev/dsp >> archivo.wavpara guardar una grabacion (si el pc tiene microfono) en un archivo wav

Suerte y hasta otra

Protocolos de internet [HTTP]

Este es el primero de una serie de posts sobre los protocolos que se suelen usar en Internet (HTTP, FTP, SOCKS, IRC...), la idea es hacer pequeña introducción a quien no quiera (o no pueda) leerse largos manuales u otros documentos como los RFC por falta de tiempo, por desconocimiento del lenguaje técnico... o por pereza[http://emoticons4u.com/happy/682.gif]

¿Qué es HTTP?

HTTP es un protocolo que funciona sobre TCP/IP y que se suele utilizar cuando navegas por la red, o en las descargas directas, aqui veremos como funciona el HTTP/1.1, que es el "estándar" hoy en dia

Esta, por ejemplo,  es una "conversacion" HTTP (algo así ocurre al acceder a la página principal de Google):

[Lo que va con un # son comentarios]

El cliente (su navegador) se conecta a www.google.es en el puerto 80 (el

puerto estándar)

Se especifica que fichero (o directorio) se pide, en este caso es '/', el

directorio raíz [Cliente] GET / HTTP/1.1

Ahora se especifica a que dominio se pide (esto se utiliza para saber que

página web se esta visitando

en caso de tener varias web en el mismo servidor)

[Cliente] HOST: www.google.es

Y tambien dice que navegador se está utilizando, por ejemplo, con firefox

podrá ser [Cliente] USER-AGENT: Mozilla/5.0 (Windows; U; Windows NT 5.0; es-ES; rv:1.9.2) Gecko/20100115 Firefox/3.6

Por supuesto se envían mas cosas (lenguaje utilizado, compresiones

aceptadas...), pero esto es lo esencial

Para mostrar que ya acabo, el cliente envía una línea en blanco

[Cliente] (linea en blanco)

Y el servidor responde...

[Servidor] HTTP/1.1 200 OK

Ademas se muestra la longitud del archivo (en bytes)

[Servidor] Content-Length: 5012

Y su tipo

[Servidor] Content-Type: text/html

Cuando acabe de enviar la informacion, enviara una linea en blanco

[Servidor] (linea en blanco)

Y despues envia el archivo que se pidio (en este caso la pagina web)

Blablabla...

Y ya está :) , ya tenemos la página web... ahora veamos como funcionan las cosas una a una.

Por decirlo así hay tres partes, las cabeceras que envía el cliente,que tienen información sobre el propio cliente, el protocolo que usa y el archivo que quiere, las cabeceras que envía el servidor, que tienen información sobre la petición (si fue aceptada, si el archivo no existe, .... ), sobre el servidor ( algo así como "POWERED BY ...") y sobre el archivo, y el archivo en si.

Las dos cabeceras utilizan un formato bastante sencillo, la primera línea , que sigue su propia sintaxis, y el resto de las cabeceras, con la forma: ":" Y se acaba con una línea en blanco.

La primera linea que envia el cliente sigue esta forma Bien, vamos por partes, los comandos son estos: - GET - POST - HEAD - TRACE - DEL

[Referencias] http://es.wikipedia.org/wiki/Hypertext_Transfer_Protocol http://www.w3.org/Protocols/rfc2616/rfc2616.html

Taluego!

Marchando una de exploits!

Ya estamos acostumbrados a que los de Microsoft hagan de las suyas, dejando bugs explotables sin parchear y con ello dejando a sus usuarios solos ante el peligro, despues pasa lo que pasa, la historia de hoy no es diferente... vamos haya:

Las malas noticias:

  1. (CVE-2010-0249) El bug en IE no es algo reciente (el_14_de_este_mes_ya estaban_los_de McAfee_hablando_sobre_el) ,pero aun sigue vigente:

Bug: permite a atacantes remotos ejecutar codigo arbitrario accediendo a un puntero asociado con un objeto borrado.

Son vulnerables IE6, IE7 y IE8, con Windows 2000 SP4, Windows XP, Windows Server 2003, Windows Vista, Windows Server 2008, Windows 7 y Windows Server 2008 R2.

Simplemente navegando con uno de estos navegadores y SO's dentro de una pagina web hecha a proposito para explotar el bug permitiria acceso al sistema. (El exploit se puede conseguir a traves de Metasploit, por ejemplo)

Nota: antes se decia que con el DEP de IE, se evitaba la explotacion del bug, con el ultimo exploit esto ya no es verdad.

  1. ( CVE-2010-0232 ) [Anuncio_de_la_vulnerabilidad] El  fallo en todos los Windows de 32 bits (a partir del NT)

Un fallo en todos los Windows  debido a la forma en la que manejan las aplicaciones de 16 bits permite la explotacion para conseguir la elevacion de privilegios hasta SYSTEM (el usuario con mas privilegios de Windows).

En KiTrap0D.zip esta comprimido el exploit y el anuncio de la vulnerabilidad (en ingles)

Hay una extensa explicacion en el boletin de Hispasec: http://www.hispasec.com/ unaaldia/4106/

Las buenas noticias:

Evitar los problemas es relativamente facil, para el bug de IE, puedes instalar otro navegador (como recomiendan los gobiernos Aleman y Frances): Firefox, Google Chrome, Opera  o desactivar el Javascript.

Para evitar el Bug de Windows hay que deshabilitar el soporte para aplicaciones de 16 bits (que ya no se usan), aqui hay un video que indica como hacerlo en XP: http://www.youtube.com/watch?v=u7Y6d-BVwxk

Suerte y hasta otra

pyCrawler 0.1 (Crawler en Python)

Esto es un ejemplo de como hacer un crawler (un script que va siguiendo los enlaces de las paginas web) escrito en python.

El proposito original del script era hacer mas sencillo el trabajo de moderacion de un sitio web, filtrando las imagenes (por url), textos, enlaces y titulos, a traves de una blacklist (nota: estas no traen por defecto ningun elemento, asi que hay que añadirlos a mano, en las lineas 170 y 171,implementadas como listas).

Lo que se hace al encontrar algo en la lista negra se define en la funcion Aviso (linea 16).

Como el proposito original era la moderacion, el script esta programado para no seguir ningun enlace fuera de ese sitio web (pero esto se puede cambiar facilmente).

Link: pyCrawler

Suerte y hasta otra.

Un par de scripts perl

Uno para lanzar comandos de consola/programas como daemon (se usa como el comando time ): ./daemonize.pl [comando] Por ejemplo, si queremos hacer un ./configure;make;make install... ./daemonize.pl "./configure;make;make install" Daemonize

Y otro para extraer los elinks de una pagina web y pasarlos al aMule ( via comando ed2k ), con cambiar la funcion link_mngr , se puede adaptar para links http, o para usar otro comando:  getMule

Suerte

Y... empezamos fuerte

Con un programa para distribuir el aircrack... no esta acabado del todo, no distribuye los archivos .cap (hay que hacerlo a mano) ni soporta el uso de diccionarios, pero por lo demas funciona perfectamente.

Solo hay que hacer make;make install

Descargar

Suerte y hasta otra.

Jugando a Core Wars [2° Parte/2]

Sigamos con el Core Wars... Resumiendo, lo que vimos hasta ahora fue:

;Comentarios     ;name nombre del programa     ;author autor     MOV A,B ;Copia A en B     ADD A,B  ;Añade A a B     JMP A     ;Se salta la instruccion A     DAT A,B ;Un espacio para datos

Formas de indicar una direccion:

-Inmediata, por de la posicion donde esta el valor, se indica con un '#' -Directa, por la posicion actual, se representa con '$' (o sin nada) -Indirecta, por el valor de la posicion indicada, se indica con un '*' si es el primer campo (A), o con '@' si es el segundo campo (B)

Pero hay mas formas de indicar una direccion de forma indirecta:

  • La del campo A, restandole 1 antes, '{'
  • La del campo B, restandole 1 antes, '<'
  • La del campo A, sumandole 1 despues, '}'
  • La del campo B, sumandole 1 despues, '>'

Por ejemplo, se podria modificar el programa "dwarf"

;name Dwarf             ;author A. K. Dewdney dwarf  ADD #4, bomb            MOV   bomb, @bomb            JMP    dwarf

bomb  DAT #0

Haciendo que llene todos los espacios de memoria 1 a 1, en vez de cuatro en cuatro, y de paso eliminamos una instruccion (con lo que el programa es mas rapido)

dwarf  MOV   bomb, >bomb           JMP    dwarf

bomb  DAT #1

Veamos las diferencias, la primera es que ya no esta la instruccion ADD por que lo que hacia (cambiar el valor de "bomb" para evitar estar siempre "golpeando la misma zona")ahora lo hace el MOV. La segunda es el campo B de la instruccion MOV incrementa el valor del campo B de "bomb" uno de cada vez (por el '>'). La ultima es que el valor al que apunta "bomb" al principio es el siguiente ('#1'), ya que al no haber ADD y a que el incremento es posterior, si fuera el mismo ('#0'), se sobreescribiria, algo totalmente inutil.

Ahora algo mas complejo... aunque no por ello util:

SUB #7,inst ;Para reajustar el puntero de instruccion       SUB #6,pos ; Esto tambien       MOV >inst,>pos       SEQ inst,inst+1 ;Aqui esta el problema XD       JMP -2       JMP -14 ;Al proximo paso pos  DAT #-9 inst  DAT #0 ;Los valores que quedaran despues de copiarse a si mismos        DAT #2

Como se puede ver aqui hay instrucciones nuevas: -La primera es SUB (de substract, restar ), funciona igual que el ADD, pero en vez de sumar, resta (logicamente es igual que hacer ADD de un numero negativo) -La otra es SEQ(skip if equal, saltar si es igual), compara las dos instucciones y si son iguales se salta la siguiente instruccion

Veamos que hace el codigo entonces : El DAT con la etiqueta pos, indica la posicion a donde se va a copiar, y el de la etiqueta inst, la instruccion que se va a copiar. El DAT siguiente al de inst tiene siempre el valor #2, esto servira para comprobar si se acabo de copiar todo el codigo.

-Resta 7 al DAT que indica la instruccion a copiar (para que apunte al principio del codigo)    [ SUB #7,inst ] -Resta 6 al DAT que indica donde se copiara la instruccion (para que apunte a la proxima seccion donde se copiara) [ SUB #6,pos ] -Copia la instruccion a la que apunta inst a la posicion que indica pos, y incrementa en 1 los dos (para que apunten al siguiente) [ MOV >inst,>pos ] -Si instes igual a lo que hay en la siguiente posicions, se salta la siguiente posicion [ SEQ inst,inst+1 ] -Vuelve atras 2 instrucciones [ JMP -2 ] -Vuelve atras 14 instrucciones (pasa al bucle siguiente) [ JMP -14 ]

Es decir, que se copia todo hacia atras, hasta que acaba y salta hacia atras, para continuar copiandose.La utilidad que tiene esto es poca, con un minimo cambio en cualquier parte del codigo que se este ejecutando, el programa falla.

Las opciones para cambiar el flujo del programa son:

-SEQ (explicado anteriormente) -SNE (funciona al reves que SEQ) (Skip if Not Equal, saltar si no es igual) -SLT (se salta la siguiente instruccion si el campo A es menor que el campo B) (Skip if Less Than, saltar si es menos de)

-JNZ, si el valor del campo A es distinto de 0, se salta a la posicion que indica el campo B (Jump if Not Zero, saltar si no es cero) -JZ, como JZN, pero si el valor de A es 0 (Jump if Zero, saltar si es cero) -DJN, como JNZ, pero decrementa previamente el valor de A (Decrement & Jump if Not zero, decrementar y saltar si no es cero)

-SPL, se crea un segundo proceso que empieza en la posicion indicada (Split, separar)

La unica que introduce algo nuevo es SPL, veamos un ejemplo:

SPL 0     MOV 0,1

  • SPL 0, crea un proceso mas, que seguira en la misma instruccion (si, asi continuamente)- MOV 0,1 ... un clasico imp (como el primero de todo)

Lo que hace es generar muchos procesos, ejecutando todos el codigo del imp Si lo ejecutamos veremos que aunque al principio el conjunto de imps avanzan relativamente rapido, poco a poco van mas lentos, esto es por la forma que hay de repartir el tiempo entre los procesos:

Durante el turno de cada programa se ejecuta un proceso suyo y este no se volvera a ejecutar hasta que lo hayan hecho el resto

Esto significa que cuantos mas procesos haya para el programa, mas habra que esperar para que se repita el mismo proceso (por esto y por otras cosas suele haber un limite de procesos por programa)

Ya no se me ocurre nada mas que pueda hacer falta para escribir un programa de Core Wars, asi que eso es todo por ahora.

Quien no tenga problemas con el ingles tiene un buen tutorial en [ http:// vyznev.net/corewar/guide.html ]

Actualizacion: Uno mas ( este no lo explicare :)}, es bastante sencillo )

;name Code Runner     ;author Kenkeiras

ADD #4,3     SPL >2     JMP -2     DAT #1,#1

Suerte

Jugando a Core Wars [1° Parte/2]

Aqui veremos como funciona el juego Core wars, en el que hay que escribir un programa que intente eliminar a sus oponentes (para esto hay varios metodos... hacer que dividan por cero, que intenten ejecutar algo que no sea codigo,etc )

No voy a explicar como instalarlo, ya que hay muchos programas que sirven para jugar, puedes encontrar muchos aqui: http://homepages.paradise.net.nz/~anton/ cw/corewar-faq.html#CoreWarSystems En los repositorios de Ubuntu/Debian hay un paquete llamado corewars [sudo apt- get install corewars] que sirve perfectamente, pero es posible que despues no este en el menu, si es asi tendras que abrir un terminal y lanzar corewars

El lenguaje que se usa (llamado Redcode) es bastante parecido al Ensamblador, asi que aunque quien maneje este tendra mucho trabajo adelantado (se usan ADD's, MOV's, JMP's...), para est@s ultim@s hay que destacar que la sintaxis es mas parecida a la de AT&T que a la de Intel (por ejemplo en el ADD el primer argumento es la cantidad a añadir y la segunda donde se añadira), se explicara todo como si no se tuviera ninguna nocion de ensamblador.

Nota: desde ya mismo perdon por algunas licencias que me tomare para intentar hacer mas sencillo todo (como llamar "bytes" a las posiciones de memoria)

Como primer ejemplo utilizaremos el programa mas sencillo, llamado imp (de impulso):

;name Imp

;author Walter Hofmann

mov 0,1

Si lo ejecutamos veremos que va llenando la memoria byte a byte (si se le puede llamar asi), uno de cada vez.

Veamos como es el codigo... lo que va despues de un ';' es un comentario (no tiene relevancia en el juego), algunos MARS (las maquinas virtuales donde suceden los "combates") buscan cierta informacion en los comentarios, por ejemplo los que despues de el ';' llevan la palabra "name", especifican el nombre del programa, y los que despues del ';' llevan "author", muestran el nombre del autor del programa.

Hasta ahora no paso nada que afectase a la "maquina" que ejecuta el programa, ahora viene lo divertido,el codigo MOV 0,1 copia la instruccion (MOV) que esta en la posicion 0 desde el codigo (el propio codigo) hasta la posicion 1 desde el codigo, la posicion de memoria siguiente, con lo que la instruccion se copia a la siguiente posicion y despues se ejecuta lo que haya en la siguiente posicion ( si, el mismo codigo otra vez ).

Para entenderlo mejor veamos rapidamente como funciona la maquina:

La memoria de la maquina es circular (no hay punto inicial ni final), es lineal (solo se puede ir hacia adelante o hacia atras) y es relativa (solo se puede especificar una posicion a partir de la actual, no se puede decir por ejemplo, la posicion 74).

El procesador de la maquina ejecuta una instruccion ( que siempre ocupan 1 "byte" ) y a menos que la instruccion implique un cambio en el flujo del programa (JMP, JNZ... ya se explicaran despues) a continuacion se ejecuta la siguiente, si no hay ninguna o la operacion no esta permitida (como una division por 0), el proceso "muere".

Entonces nustro ejemplo pasaria algo asi:

t=0

...

| ???          |

| MOV 0,1  | <- (Se va a ejecutar esto)

| ???          |

| ???          |

...

t=1 (despues de ejecutar la primera instruccion)

...


| ???         |

| MOV 0,1 |

| MOV 0,1 | <- (Se va a ejecutar esto)

| ???         |

...

t=2 (despues de la segunda instruccion)

...


| ???         |

| MOV 0,1 |

| MOV 0,1 |

| MOV 0,1 | <- (Se va a ejecutar esto)

| ???         |

...

Asi el programa va "haciendo el camino" y sigue hasta que algo lo detenga.

Ahora veamos algo un poco mas complejo.

;name Dwarf ;author A. K. Dewdney dwarf  ADD #4, bomb MOV   bomb, @bomb JMP    dwarf

bomb  DAT #0

Aqui se introducen muchas mas posibilidades, empezando por esta:

bomb   DAT #0

Esto significa, hay un "byte" que no contiene ninguna instruccion, sino datos, y a esta posicion tiene la etiqueta "bomb" (para no tener que ver donde seria su direccion con cada nueva instruccion), su uso es bastante simple, si alguien intenta ejecutarlo el proceso falla, y se puede utilizar para almacenar datos (de ahi su nombre, DAT).

La segunda es:

dwarf  ADD #4, bomb

Un "byte" con la etiqueta "dwarf" y con la instruccion ADD, que añade el valor del primer argumento (en este caso 4), a lo que este en la segunda posicion (en este caso a lo que tiene la etiqueta "bomb" ).

Despues tenemos:

MOV   bomb, @bomb

Como ya vimos en el primer ejemplo, la instruccion MOV copia lo que haya en el primer valor, en el segundo,pero en este caso el segundo valor se utiliza para indicar donde se va a copiar...me explico:

Hay tres grupos de formas de indicar una direccion, inmediata, directa e indirecta.

La inmediata es la que se toma partiendo de la posicion de donde se toma el valor, se indica con un '#' antes del valor (por ejemplo, el DAT o el primer valor del ADD).

La directa es la que se calcula partiendo de la posicion actual, se indica con un '$' o no añadiendo nada (por ejemplo, en el primer valor del MOV o en el JMP).

La indirecta, es la que se calcula partiendo de la posicion que indique el "byte" que se indique, dependiendo de si es el que indica el primero (campo A) o el segundo argumento (campo B) del "byte" se indican con un '*' o '@' respectivamente (se pueden hacer mas cosas, pero ya me estoy extendiendo demasiado por ahora)

Entonces     MOV   bomb, @bomb copia lo que haya en la posicion "bomb" a donde apunte el campo B de "bomb". Por ultimo...

JMP  dwarf

La instruccion JMP salta a la posicion que se indique, en este caso la posicion con la etiqueta dwarf (el principio del codigo). En resumen, lo que hace el codigo es:

  • Añade 4 a la posicion que apunta "bomb"  (MOV #4,bomb)
  • Copia "bomb" a la posicion que apunta (MOV bomb,@bomb)
  • Vuelve al principio (JMP dwarf)

Asi que va llenando la memoria de DAT's, (si algun programa los intenta ejecutar falla), por ejemplo, contra un imp, podria ocurrir esto.

t=0 ...


| MOV 0,1  |

| MOV 0,1  | <- (Se va a ejecutar esto)

| ???          |

| ???          |

...

t=1 (cuando el imp se copia a la siguiente posicion, y en el mismo "turno" el "bomb" del programa anterior se copia a la misma posicion)

...                                                          ... ---------------                                       ---------------- | MOV 0,1  |                                        | MOV 0,1  | ---------------                                        ---------------- | MOV 0,1  |                                        | MOV 0,1  | ---------------                           =>         ----------------- | MOV 0,1  | <-  (Se va a ejecutar)    | DAT         | <- ---------------                                        ------------------ | ???          |                                        | ???          | -------------- -                                       ----------------- ...                                                        ...

Esto es todo por ahora... hay una guia bastante completa en [http://vyznev.net/ corewar/guide.html]

Suerte