domingo, 30 de diciembre de 2012

Hello World en ASM

A continuación se muestra el conocido programa "Hello World" en Lenguaje Ensamblador, para compilar se usa NASM para Linux. El programa despliega en la consola de linux el mensaje "Hello World".

_____________________________________________________________________


; Author          : Christian Verastegui 
; Description   : A simple "Hello World" program in assembly for Linux, 
;                        using NASM.
; Build using these commands in console:
;       nasm -f elf -g -F stabs helloworld.asm
;       ld -o helloworld helloworld.o

section .data           ;Section with initiliazed data

HelloW:  db "Hello World", 10
LenHello equ $-HelloW

section .bss            ;Section with unitiliazed data
-----------------------------------------------------------------------------------------------------------------
section .text           ;Section containing code

global _start

_start:
    NOP                             ;No OPeration
    MOV EAX,4                ;Specify sys_write call
    MOV EBX,1                ;Specify File Descriptor 1: Stdout
    MOV ECX,HelloW      ;Put string address into ECX
    MOV EDX,LenHello    ;Put string length into EDX
    INT 80h                         ;Make the Kernel Call

    MOV EAX,1           ;Code for Exit Syscall
    MOV EBX,0           ;Return a code of zero
    INT 80h                   ;Make kernel call



La sección .data contiene información inicializada, es decir, declarar información que necesitaremos el resto del programa, esto podría ser como un #DEFINE en lenguaje C. En este programa almacenamos la cadena de carácteres y la identificamos como HelloW, el término "db" indica define byte y quiere decir que cada caracter será de un byte de tamaño, al final de la cadena está el número 10 que indica un salto de línea, esto podría traducirse en C como "\n". También usamos el comando EQU, que sirve para igualar, en esta instrucción indicamos que LenHello será del mismo largo que la cadena HelloW.

La sección .bss almacena información que no ha sido inicializada, aquí podríamos guardar Buffers, o memorias donde escribiremos. En este programa no se usa porque solamente desplegamos un mensaje.

En la sección .text es donde escribiremos nuestro código, empezamos con una etiqueta llamada global _start, esto es para decirle al compilador que nuestro MAIN se encuentra ahí, la declaramos global para que el compilador la pueda llamar.
Una vez posicionados en la etiqueta _start podemos ver la instrucción NOP, este comando no realiza alguna operación, solo es util cuando usamos breakpoints al inicio del programa.
La instrucción INT 80h quiere decir que realiza un INTerrupción en el programa para llamar a la memoria 80h, en esta dirección le damos al kernel el control, el kernel realiza una operación según lo que vea en los registros EAX, EBX, ECX y EDX.

Las llamadas a Kernel es un tema amplio, pero se puede consultar en el siguiente link:

http://asm.sourceforge.net/syscall.html

Todo esta información la obtuve del libro "Assembly Language. Step by Step Programming with Linux" escrito por Jeff Duntemann, 3era Edición.

Hasta la próxima!

jueves, 15 de julio de 2010

Problemas con Runnable

Hola maestro y compañeros, tengo un problema al querer implementar el Runnable a mi programa anterior para que el circulo se moviera automatico cada vez que el usuario oprime una tecla de dirección. Para cada tecla puse una variable booleana, y dentro del while del bloque run () puse if para cada caso de la tecla. Implementé el Runnable dentro de mi clase principal, ¿se tiene que crear otra clase como en el ejemplo que se vió en clase del controlador?, tal vez ahi esté el problema pero aún así el programa no quiso mover en automático :(


Aquí está lo que quise implementar cuando se oprime una tecla, en este caso es la tecla direccional arriba, es lo mismo con las otras teclas, solo que cambian los valores de las variables booleanas
public void keyPressed(KeyEvent e) {
switch(e.getKeyCode()){
case KeyEvent.VK_UP:
System.out.println("Arriba");
this.corriendo=true;
this.corriendo1=true;
this.corriendo2=false;
this.corriendo3=false;
this.corriendo4=false;

break;

Gracias por la atención

miércoles, 7 de julio de 2010

PROGRAMA EVITAR OBSTACULOS O LABERINTO

Bueno este es el programa anterior ya corregido, el jugador puede dibujar sus propias líneas como obstáculos y cuando el círculo toca esas líneas se reinicia el juego. Le puse 4 variables que son el punto de comparación entre el círculo y los puntos iniciales y finales de cada línea, que son:
private double compa;
private double compi;
private double compo;
private double compu;

Dentro del ciclo while se usa esas variables para comparar la distancia del círculo a una línea específica.
while(i.hasNext()){
Linea l = i.next();
gr.draw(new Line2D.Double(l.xs*ancho, l.ys*altura,l.xf*ancho,l.yf*altura));
compa =l.xs-(this.x);
compi =l.ys-(this.y);
compo =l.xf-(this.x);
compu =l.yf-(this.y);

Ya una vez establecidos esos valores se recurre a las condiciones de que sean menor de los puntos "x" y "y" del círculo:



if((l.xs< l.xf ||l. ys< l.yf){ // Se establece si la línea se dibuja de izquierda a derecha o de arriba hacia abajo
if(compa<0)&&(compo>0)){ //este if es para líneas horizontales
if(compi<0.05&&compi>-0.01){
this.reset();
System.out.println("TOCASTE UNA LÍNEA!!! D:");
}
}else if(compi<0&&compu>0){ //Este if es para líneas verticales
if(compa<0.05>-0.01){
reset();
System.out.println("TOCASTE UNA LÍNEA!!! D:");
}

}
}


if(l.xs>l.xf||l.ys>l.yf){ // Se establece si la línea se dibuja de derecha a izquierda o de abajo hacia arriba
if(compo<0&&compa>0){
//este if es para líneas horizontales
if(compi<0.05&&compi>-0.01){
this.reset();
System.out.println("TOCASTE UNA LÍNEA!!! D:");
}
}else if(compu<0&&compi>0){
//Este if es para líneas verticales
if(compa<0.05>-0.01){
reset();
System.out.println("TOCASTE UNA LÍNEA!!! D:");
}
}



Hay 2 if's importantes que son cuando la línea se dibuja de izquierda a derecha o viceversa, o también de arriba hacia abajo o viceversa, así que el jugador podrá dibujar las líneas como desee, pero tendrán que ser líneas rectas.
Bueno aquí el código para descargar y disfruten haciendo laberintos y tratar d
e pasarlos =)



http://www.mediafire.com/?arz55nuhilz




jueves, 1 de julio de 2010

nuevo laberinto

Este programa es el mismo juego que presenté la vez pasada, sólo que ahora incluí lo uqe me recomendó la doctora que era que el jugador dibujé las líneas de las paredes del laberinto, una vez que dibuja las líneas en el código puse que cuando utilize el iterator cheque las coordenadas del círculo, y sí son iguales que regrese el círculo al inicio.

Iterator i= this.lineas.iterator();
while(i.hasNext()){
Linea l = i.next();
gr.draw(new Line2D.Double(l.xs*ancho, l.ys*altura,l.xf*ancho,l.yf*altura));
if(this.x*anchol.xs*ancho){
if(this.y*anchol.ys*altura){
this.reset();
}
}
}
pero hay un problema, a veces si ejecuta la acción, pero cuando se quiere volver a jugar ya no impide que el circulito no pase a través de las líneas, no sé si sea alguna variable que se queda con un valor anterior.
Pueden bajar y checar el código de este link http://www.mediafire.com/?dydywrifyyn
:)

jueves, 24 de junio de 2010

Juego de llegar a la meta

Saludos
El siguiente juego trata de hacer que la bolita llegue a la otra casilla, para eso tendrá que evitar los obstáculos que se encuentren en su camino, si la bolita toca algún obstaculo tendrá que iniciar desde cero. Una vez que se llega a la casilla final el sistema imprime el mensaje que ganaste, quise implimentar que se abriera otra ventana pero me falló algo y la desesperación hizo que ya no pusiera la ventana con el resultado de que el jugador ganó, pero si logró modificar el juego pondré el nuevo código con la ventana que anuncia el ganador.
El código es un poco rústico ya que implemente muchos if's para cada caso en que la bolita toque cada línea, implemente 2 variables llamadas a y b las cuales utilizé como coordenadas dentro de
mi ventana y me facilitara el uso de los if 's

Aquí esta el link para la descarga:
http://www.mediafire.com/?hryyijkwmmy

En el código no hay nada nuevo que el que se vio en clase con la doctora, solo implemente los if's, las 2 variables a y b como coordenadas y dibujé las líneas con el comando g.drawLine(Iniciox, Inicioy, Finx, Finy);



jueves, 17 de junio de 2010

Programa que utiliza un botón

En este sencillo programa podemos ver la hora, para eso usamos un botón que al oprimirlo nos muestra la hora en tiempo real.
El codigo es el siguiente:



import java.util.Calendar;//Importo las librerias para utilizar el calendario, realizar el evento
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Hora {

static class Accionesdelboton implements ActionListener{
public void actionPerformed (ActionEvent event){ // Este bloque ejecuta la accion de oprimir el boton
int hora, minutos, segundos;
Calendar calendario = Calendar.getInstance();
hora = calendario.get(Calendar.HOUR_OF_DAY);
minutos = calendario.get(Calendar.MINUTE);
segundos=calendario.get(Calendar.SECOND);
JFrame Hora2= new JFrame("Hora");// En este caso al oprimir el boton crea otra ventana
// donde se mostrara la hora

Hora2.setVisible(true);
Hora2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Hora2.setSize(200,200);
JLabel Texto1 = new JLabel(hora + ":" + minutos + ":" + segundos);
JPanel panel2= new JPanel();
Hora2.add(panel2);
panel2.add(Texto1);
}
}

public static void main (String []args){ //Aqui esta mi bloque principal


JFrame Hora= new JFrame("Consultar la hora"); // Creo un formulario o ventana con el nombre
//consultar hora
Hora.setVisible(true); // Hago que el formulario sea visible
Hora.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// Hago que el programa se cierre al darle la orden de cerrar
Hora.setSize(200,200); // Establezco el tamaño de mi ventana
JPanel panel= new JPanel(); // Establezco un panel en sobre el cual pueda poner las cosas y se puedan ver en el formulario
Hora.add(panel); // Le agrego el panel al formulario
JButton Boton = new JButton("Consultar hora");// Creo un nuevo boton el cual sera el que muestre la hora
panel.add(Boton); // Le agrego el boton a panel
Boton.addActionListener(new Accionesdelboton()); // Le agrego las acciones del boton al boton que cree
}



}


Aqui hay unas imagenes del programa en ejecución: