/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Tres programas nativos x86

 
      Índice del Foro elrincondelc.com -> Otros lenguajes
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
Sorancio



Registrado: 29 May 2009
Mensajes: 878
Ubicación: España

MensajePublicado: 13/09/2009 10:16 am
Título: Tres programas nativos x86

¡Hola! Hace poco para practicar hice tres programas en ensamblador NASM para x86 en modo real. Me lo recomendó fachamix para saber si estoy preparado para hacer un SO por simple que sea.

1) ¡Hola mundo!
Escribe Hola mundo y entra en un bucle infinito para dormir.
Código:

   org 0x7C00

   mov si, mensaje
   call print
   jmp $

mensaje: db "Hola mundo", 0
print:   cmp byte [si], 0
   je print_end
   lodsb
   
   mov ah, 0xE
   mov bl, 0xF
   mov bh, 0

   int 0x10
   jmp print

print_end:
   ret

   times 0x0200 - 2 - ($ - $$)  db 0
        dw 0AA55h


2) Escritura a tiempo real.
Este programa escribe en pantalla los caracteres que envía el usuario, recibe uno, escribe uno.
Código:

   org 0x7C00

   mov bl, 0xF
   mov bh, 0x0
   
bucle:
   mov ah, 0x0
   int 0x16
   mov ah, 0xE
   int 0x10
   jmp short bucle
   
   times 0x0200 - 2 - ($ - $$)  db 0
        dw 0xAA55


3) Caja de texto simple
Este programa permite escribir hasta 9 lineas, permite borrar caracteres anteriormente escritos. Cada linea está formada en el siguiente formado:

NUMERO_DE_LINEA) Test: CARACTERES_USUARIO

Sólo se pueden borrar caracteres a partir de ":", así pues caracteres escritos por el usuario. Sólo permite nueve lineas por dos razones.

1) Es más simple
2) Trabaja con comparaciones.
Código:

   org 0x7C00

   jmp short print_start
   
new_line:
   cmp byte [msg], "9"
   je short start
            ; No podemos aguantar más de 9 lineas
   inc byte [msg]
   mov al, 0xA       ; CR nueva linea
   call print_char
   mov al, 0xD       ; LF columna 0
   call print_char
   
   mov byte [qtCar], 0   ; Contador a 0 (nueva linea, nuevo contador)
print_start:
   mov si, msg      ; Mensaje a escribir
   call print
   mov bl, 0xF

start:   
   mov ah, 0      ; Coger carácter
   int 0x16

   cmp al, 0x8      
   jne short printable   ; Si no es un caracter de retroceso
   jmp short retroceso

printable:
   cmp al, 0xD      ; Si es LF
   je new_line      ; Nueva linea
   
   call print_char      ; Escribimos el caracter y incrementamos el contador
   inc byte [qtCar]   ; qtCar++
   jmp start

retroceso:
   cmp byte [qtCar], 0      ; Si qtCar es 0 ignoramos todo
   je start

   dec byte [qtCar]      ; Eliminamos un caracter
   call print_char
   mov al, " "
   call print_char
   mov al, 0x8
   call print_char
   jmp start
   
print:  mov ah, 0xE
   cmp byte [si], 0   ; si contiene la direccion del mensaje
   je short print_end

   lodsb         ; al = [si], si++
   int 0x10
   jmp short print
print_end:
   ret

clear_char:
   mov ah, 0xE
   int 0x10
   ret

print_char:
   mov ah, 0xE
   int 0x10
   ret

   
qtCar:   db 0         ; Cantidad de carácteres que el usuario ha escrito
msg:   db "1) Test:", 0         ; La linea en la que escribe el usuario
   
   times 0x0200 - 2 - ($ - $$)  db 0
        dw 0xAA55


Cualquiera puede editar el programa y modificarlo a su gusto, sin licencias ni nada, ya que el código es para quien quiera aprender Smile.

Saludos.
Volver arriba
      Índice del Foro elrincondelc.com -> Otros lenguajes
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com