Sorancio

Registrado: 29 May 2009 Mensajes: 878 Ubicación: España
| Publicado: 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 .
Saludos. |
|