![]() |
|
|||||||
|
|
|
Share | LinkBack | Herramientas | Desplegado |
|
|
#1 |
|
Member
Fecha de Ingreso: julio-2005
Mensajes: 76
|
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 |
|
|
|
|
|
#2 |
|
Member
Fecha de Ingreso: julio-2005
Mensajes: 76
|
¿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. ] |
|
|
|
|
|
#3 |
|
Senior Member
Fecha de Ingreso: diciembre-2006
Mensajes: 1.121
|
muy bueno, pero hay cosas que no entiendo.. me explicas que significa
Código:
start: cli 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 /> ![]() |
|
|
|
|
|
#4 |
|
Ing. Electronico
Fecha de Ingreso: septiembre-2007
Mensajes: 3.122
|
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...
|
|
|
|
|
|
#5 |
|
Member
Fecha de Ingreso: julio-2005
Mensajes: 76
|
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. |
|
|
|
|
|
#6 |
|
Ing. Electronico
Fecha de Ingreso: septiembre-2007
Mensajes: 3.122
|
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... |
|
|
|
|
|
#7 |
|
Member
Fecha de Ingreso: octubre-2006
Mensajes: 57
|
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. |
|
|
|
![]() |
| Herramientas | |
| Desplegado | |
|
|