Comunidad Underground Hispana  
Visita: Descargas - Foro de juegos - Articulos - Juegos Gratis - Download Free

Retroceder   Comunidad Underground Hispana > Programacion > Programación > ASM

Respuesta Crear Nuevo Tema
 
Share LinkBack Herramientas Desplegado
Antiguo 09-feb-2008, 16:56   #1
Member
 
Fecha de Ingreso: julio-2005
Mensajes: 76
Predeterminado [U] Creando un sector de arranke

wuenass a todos, e creado un boot y lo e introducido en un disKete, el diskete se arranka y muestra un mensaje e la pantalla, el compilador Ke e usado es el Nasm, lo podeis descargar poniendo apt-get install nasm, para los K usen gui!nduos$$ lo buskais en google, si encontrais un error en el codigo o una mejora (seguro k si) los komentais si kereis.

org 7c00h ;como la makina inicia el codigo en el offset 7c00h, po indicamos al nasm k empiece a contar a parir del 7c00h
jmp main
bot db 'hola, esto es una prueba'
main mov ah,00h
mov al,01h
int 10h ; modo video
mov ah,02h
mov bh,0h ;nuemro de pagina
mov dh,0 ;renglon
mov dl,0 ;columna
int 10h
mov ax,0000
mov es,ax
mov si,bot
mov cx,24
primer mov ah,0Eh
mov bh,0
mov bl,0
mov al,[es:si]
int 10h
add si,1
loop primer
ret
; se me olvido poner la firma 55AAh da =

una vez echo el codigo, lo compilamos, la forma sencilla y sin compliKaciones es, nasm prueba.asm (prueba.asm, es el fichero a compilar)
si todo esta bien, nasm lo compila generando otro fichero con el nombre prueba, ahora ese archivo es una imagen y k tenemos k acer es meterlo en el diskete, para hacerlo se puede hacer en varias formas, pero como ami me gusta es la siguiente desde Linux.

dd if=prueba of=/dev/fd0 (aseguraos k teneis introducido un diskete k no useis)
en gui!nduos$$ seria con el comando debug lo buskais en google.

SALU2

Crass está desconectado   Responder Citando
Antiguo 03-ago-2008, 06:58   #2
Member
 
Fecha de Ingreso: julio-2005
Mensajes: 76
Predeterminado Re: [U] Creando un sector de arranke

¿Ke opinais de esto?

org 7c00h
jmp start
_msg db 'cargando el systema, espere .........'

start:
cli
mov ax,7c00h
mov ds,ax
mov es,ax
sti
mov cx,37
mov ax,0000
mov es,ax
mov si,_msg
hh1 mov ah,0eh
mov bh,0
mov bl,0
mov al,[es:si]
int 10h
add si,1
loop hh1
mov ah,00
mov dl,0
int 13h
mov ah,0
mov al,13h
int 10h
ret
times 510-($-$$) db 0
dw 0AA55h

mas o menos es igual k el anterior, pero este contiene la firma del sector de arranke.
Lo ke intento consegir ahora es k leea todo el diskete y lo copie en la memoria Ram, se ke es con la Interrupcion int 13h, pero aun no se como se utiliza, aunke el programa utiliza una interrupcion int 13H pero con el ah,0 , esto lo ke ace es resetear el diskete, para leer es con ah,2 y para escribir es con el ah,3 , pero no se como funciona muy bien

Mira estos link:
[Solo usuarios registrados pueden ver los links. ]
[Solo usuarios registrados pueden ver los links. ]
[Solo usuarios registrados pueden ver los links. ]
Crass está desconectado   Responder Citando
Antiguo 26-ene-2009, 17:20   #3
Senior Member
 
Fecha de Ingreso: diciembre-2006
Mensajes: 1.121
Predeterminado Re: [U] Creando un sector de arranke

muy bueno, pero hay cosas que no entiendo.. me explicas que significa
Código:
start:
cli
el start: supongo que es una etiqueta.. pero cli no se que es..
tampoco se que es sti, y por que pones
hh1 mov ha,0eh
__________________
A veces sentimos que lo que hacemos es tan solo una gota en el mar, pero el mar sería menos si le faltara una gota.<br />Alguno se estima atrevido, cuando con otros se compara. Algunos creo que hubo tan discretos que no acertaron a compararse sino a sí mismos.<br />Nuestras acciones hablan sobre nosotros tanto como nosotros sobre ellas.<br />
cuban-hack está desconectado   Responder Citando
Antiguo 27-ene-2009, 18:10   #4
Ing. Electronico
 
Fecha de Ingreso: septiembre-2007
Mensajes: 3.122
Predeterminado Re: [U] Creando un sector de arranke

Vaya me pierdo en tus codigos, nose cuales son etiquetas y cuales no... Por ejemplo hh1, dw (para mi es declaracion de doble word), times que son??

Yo trabajo las etiquetas colocandole al final ":", ejemplo...

Aqui: mov AX, 7C00h
.
.
.
.
.
jmp Aqui

Pero a ti no te entiendo mucho, hay comandos que nunca he visto... Si puedes explicar el codigo de manera concreta se te puede entender mas.

Saludos...
__________________
[Solo usuarios registrados pueden ver los links. ]
kaiser1313 está desconectado   Responder Citando
Antiguo 08-feb-2009, 18:29   #5
Member
 
Fecha de Ingreso: julio-2005
Mensajes: 76
Predeterminado Re: [U] Creando un sector de arranke

org 7c00h
Cuando se inicia la maquina este carga la bios (podremos usar las interrupciones de la bios) y despues inicia el masterboot en el segemnto 0000 y en el offset 7c00 en hexadecimal, que quedaria asin 0000:7c00, pues con el org indicamos al nasm que empiece a contar a partir del offset 7c00 le ponemos una "h" alfinal para decirle que esta en formato hexadeciamal, si estamos creando un programa para el DOS, El dos carga el programa en el offset 100 en hexadecial, pues tendriamos que poner org 100h.
jmp start
El jmp es un salto hacia una dirrecion, por ejemplo podemos poner jmp 0000:7c05h pero en este caso hemos puesto un nombre "start" este es una etiqueta definida mas adelante para indicarle el offset automaticamente.
_msg db 'cargando el systema, espere .........'
bien pues este es el mensaje que se mostrara, _msg es un nombre que le indicaremos para saber cual es el offset donde empieza el mensaje, el db le decimos que es un bye y 'cargando el systema, espere .........' son los caracter que queremos que muestre en la pantalla, tenemos que tener en cuenta que contiene 37 caracter incluido los espacios y los puntos, esto es importante por que luego haremos una llamada a la bios para que muestre un caracter, el caracter estara en la memoria ES:SI, por lo tanto en ES tendra 0000 que es el segemento y en SI (que es el offset) tendra el offset del primer caracter que lo hemos definido con un nombre _msg, cuando haya mostrado el primer caracter, en el SI le tenemos que sumar uno, para que apunte al segundo caracter y mostrarlo, y hacin hasta llegar haber sumado 37 vezes y para no hacer el codigo largo, pues como es logico lo haremos con un bucle
start:
La etiqueta, para que el jmp salte hasta aqui, que contiene los binario y no se tope con el mensaje de arriba que es Ascii
cli
Bien pues esto simplemente deshabilita las interrupciones, a partir de aqui no podemos hacer niguna interrupción, esto no hace falta ni ponerlo, o almenos para este programa,
mov ax,7c00h
mov ds,ax
mov es,ax

ax contendra 7c00 en hexadecimal, ds contendra lo que tiena ax y es contendra lo que tiene ax, por lo tanto ds y es tendra 7c00h, podriamos ponerlo directamente mov ds,7c00h mov es,7c00h, pues no, por que esos registros no se puede ponerlo directamente sin usar algun registro de la cpu
sti
Lo contrario de cli, Habilitar las interrpciones
mov cx,37
En el registro cx contendra 37, este es el número de caracter que tiene nuestro mensaje, para realizar el bucle, mas adelante.
Ejemplo:
mov cx,12
bucles1 mov ax,7
mov dh,3
................
................
loop bucles1
cuando llege aqui salta hasta la etiqueta bucles1
y en cx le resta uno, cuando en cx tenga cero
este no saltara y segira continuando
mov ax,0000
mov es,ax
mov si,_msg

ax tendra 0000, es tendra el valor de ax, si tendra la dirrecion del offset donde esta definido la etiqueta _msg
bien pues ahora es y si apuntara el primer caracter de nuestro mensaje (recuerde es segmento y si offset), esto quedaria hacin ES:SI

hh1 mov ah,0eh
mov bh,0
mov bl,0
mov al,[es:si]
int 10h
add si,1
loop hh1

Pues aqui mostrara todo los caracter en pantalla.
hh1 mov ah,0eh definimos una etiquete hh1 y el registro ah le damos un valor 0E en hexadecimal.
mov bh,0 Le damos un valor del registro bh que tendra cero.
mov bl,0 Le damos un valor del registro bl que tendra cero.
mov al,[es:si] al tendra el valor donde apunta los registro ES y SI, por lo tanto apuntara al primer caracter de nuestro mensaje.
int 10h llamamos a la interrpcion de la bios, ¿pero por que en los registros ah, bh y bl ponemos esos valores?
En la llamada de la bios por la 10h que es la del video, tendremos que darle unos valores, para decirle lo que queremos hacer,
si en algun caso en el registro ah le damos el valor 2 (mov ah,2), le decimos a la bios que nos referimos a establecer la posicion del cursor, entonces en el registro dh le damos el valor de la fila y en el dl le damos el valor de la columna, pero en nuestro caso ponemos en ah 0EH, que es la de escribir un caracter en pantalla, en el al, tendra el caracter a escribir, ver esto [Solo usuarios registrados pueden ver los links. ], esta en ingles pero lo paso traducido con el google, no hace falta memorizarlar todas las interrupciones y los valores, pero si tenerla presente, en la interrpcion 21h (int 21h) se refiere a la del Sistema Opertativo y no a la bios, por lo tanto si nuestro programa es un sector de arranque tener en cuenta, que solo tenemos las interrpciones de la bios y no la de DOS o de Linux
add si,1 con esto lo que hacemos es el registro si le sumamos uno, por lo tanto apuntara al siquiente caracter.
loop hh1 bien, pues esto es un bucle, mientras cx no tenga cero saltara hacia la etiqueta hh1, recuerde que el registro cx sera restado uno automaticamente.

Pues las siguientes usan la interrupció, 13h pero todabia no se manejarlo muy bien, miren [Solo usuarios registrados pueden ver los links. ].
Espero que os sirva un salu2 a tod@s.
Crass está desconectado   Responder Citando
Antiguo 08-feb-2009, 19:03   #6
Ing. Electronico
 
Fecha de Ingreso: septiembre-2007
Mensajes: 3.122
Predeterminado Re: [U] Creando un sector de arranke

Ok todo lo que explicaste ya lo sabia, solo que hh1 al ser una etiqueta deberia de tener hh1: Nose pero yo lo hago asi...

Ahora esta parte no la explicaste y es lo que deseo saber...

times 510-($-$$) db 0
dw 0AA55h

Para mi estas definiendo variables, pero porque al final del programa?? No entiendo...
__________________
[Solo usuarios registrados pueden ver los links. ]
kaiser1313 está desconectado   Responder Citando
Antiguo 23-ene-2010, 18:48   #7
Member
 
Fecha de Ingreso: octubre-2006
Mensajes: 57
Predeterminado

Cita:
Iniciado por kaiser1313 Ver Mensaje
times 510-($-$$) db 0
dw 0AA55h

Para mi estas definiendo variables, pero porque al final del programa?? No entiendo...
Bien la BIOS necesita saber que esta leyendo un sector ejecutable (booteable), por lo que necesitamos poner la firma AA55h al final del sector, dado que cada sector mide 512 bytes el times relllena nuestro sector hasta llegar a 510 bytes, y los dos ultimos los pone con la firma, asi que ya se puede ejecutar con la BIOS el disquete,cd, disco duro, etc.
__________________
Porque juzgar a la gente, finalmente los grandes siempre son recordados y los demas quedan en el pasado.
Fulapol está desconectado   Responder Citando
Respuesta

Herramientas
Desplegado

Normas de Publicación
No puedes crear nuevos temas
No puedes responder mensajes
No puedes subir archivos adjuntos
No puedes editar tus mensajes

Los Códigos BB están Activado
Las Caritas están Activado
[IMG] está Activado
El Código HTML está Desactivado
Trackbacks están Activado
Pingbacks están Activado
Refbacks están Activado



La franja horaria es GMT -5. Ahora son las 13:05.



Juegos gratis Underground Mexico Veo Descargas Songs Traducidas Videos De Musica Conservacion Tabs Metal
Noticias
 Juegos De Coche juegos gratis online juegos Utilidades Trucos
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2010, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.3.2
Traducción por vBHispano.com