PDA

Ver la Versión Completa : Boteable en assembler


fide
24-12-2006, 14:11:51
Hola amigos, alguien me puede ayudar a crear un programa boteable en ensamblador, en delphi preferiblemente o en C++..

Gracias por la ayuda que me puedan dar.

droguerman
24-12-2006, 19:54:03
antes de meter la pata te refieres a crear un disco booteable o a una aplicación tipo autorun como las que se inician al poner un CD en la lectora

aeff
26-12-2006, 03:15:19
hola fide, disculpa si te ofendo, pero por tus anteriores posts, se me ha ocurrido hacerte una pregunta:

¿alguna vez has estado en alguna escuela para retrasados mentales?

aqui te va algo, solo necesitas tener conocimientos de ensamblador, y conmigo no cuentes para eso:

/////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////

;Compilar con MASM 5.0, luego el LINK y ejecuta el fichero.exe obtenido.

;Programa de arranque similar al de los sistemas operativos que arrancan
;desde disquetes o discos duros. Estos programas arrancan en modo real
;X86 basados en un estandar que cumplen todos los ordenadores compatibles
;con IBM-PC. Hasta la fecha los KXP-7 y Pentium-IV lo siguen haciendo.
; Todo ordenador luego de ejecutar el POST de su BIOS, cargan del disco
;duro o disquetes la informacisn contenida en un sector especmfico
;situado en cara 0, pista 0 y sector 1. Estos 512 bytes, de los cuales
;todos no son csdigo de maquina o ejecutable directamente por la CPU,
;se depositan en un segmento y desplazamiento especifico de su ordenador.
; Segmento y desplazamiento 0000:7C00H, y automaticamente se le transfiere el
;control de ejecucion al primer byte del sector cargado, es decir el puntero
;de instruccion IP de la CPU apunta a 0000:7C00H. Generalmente esta posicisn
;contiene un salto intrasegmento, desplazandose unos 53 bytes
;donde se encuentra el resto del codigo ejecutable del arranque de su ordenador.
;Este salto se debe a que cada disquete, tiene una zona especifica para indicar
;su formato, es decir cantidad de caras, sectores por pistas, cantidad de copias
;de la FAT y otros datos de interes que no debemos borrar.

;Este programa vale para su Disco duro, PERO CON MUCHOS CAMBIOS y hay que saber
;que se esta haciendo en todo momento para no perder la informacisn del disco duro.

;BIOS, Sistema basico de entrada y salida brindado por los fabricantes para acceder
;a sus dispositivos sin utilizar los puertos. Son rutinas en csdigo de maquina
;almacenadas en ROM o EPROM en trajetas, perifiricos y metherborad.

;FAT, Tabla de localizacisn de ficheros utilizada por los sistemas operativos MS-DOS,
;Windows 3.XX, 9X, 2000, NT y XP.Para los zltimos, en el caso que no desee utilizar NTFS,
;pues el estnadar segzn la capacidad de su disco duro puede ser FAT 8 bits, FAT 16 bits
;y FAT 32 bits. NTFS, es algo como la FAST, pero con menos documentacisn de su estructura
;para almacenar la informacisn el los discos duros.

;BOOT SECTOR, Sector de arranque de disquetes o Discos duros, el mismo se utiliza para
;almacenar un pequeqo programa de arranque de su ordenador, que ira cargando poco a poco
;su Sistema Operativo. Ademas contiene informacisn del tipo de soporte magnitico, como
;capacidad, sectores por cara, cantidad de FAT, Copias de Fat...


.8086

alfa segment para public 'code'
org 0100h
assume cs:alfa,es:alfa,ds:alfa,ss:alfa
inicio proc near

push cs
pop ds
push cs
pop es


mov ax,0201h ;Servicio 02H para leer un sector del disco
mov cx,0001h ;pista y numero del sector a leer dentro de la pista
mov dh,00h ;Cara donde se encuentra el sector a leer
mov dl,0 ;Unidad fisica a leer,en este caso Torre "A" no cambie esto.
mov bx,offset final ;Zona donde cargaremos los 512 bytes del sector leido
int 13h ;Interrupcion del BIOS dada por el fabricante para
;acceder a los discos.
; todo esto es para leer el sector 1, cara 0, pista 0 de su disquete,
; el cual debe estar ubicado en la torre "A" de su ordenador.

mov si,offset inicio
mov bx,offset mensx

jnc notERRORread ;Salata si no hay error en la lectura del disquete


errorINdisk:
dec cs:[flagDISK] ;Como hay error hago la ultima operacion 3 veces
jz Print ;Si ya se ha intentado realizar 3 veces, Aborto


xor ah,ah ;Servicio 0H para recalibrar unidad de disco
mov dl,0 ;Unidad "A a recalibrar producto a un error
int 13h
jc errorINdisk ;Si hay error al recalibrar salto a chequear veces


recalibro: ;Si salta aqui, es que no hay problemas en recalibracion
push si ;En este registro comienza la rutina pendiente
ret ;Se apila y luego se le dice a la CPU que retorne al valor
;que hay en la pila que es el de la rutina pendiente.
;Esto es un recurso de programacion, pues normalmente
;Un "RET", va acompa$ado de un "CALL"

notERRORread: ;Si salta aqui, es que pudo leer el Boot sector
mov cs:[flagDISK],03h ;Restablece a 3 veces los intentos de la ultima operacion

mov si,offset final+03h ;Posicion donde estan los datos del disquete Para el S.O
mov di,offset reservados;Posicion donde salvare esos datos para cuando escriba
mov cx,0033h ;Cantidad de bytes a mover

cld
rep movsb ;Permite mover bytes de DS:SI a ES:SI segun la cantidad
;puesta en CX

mov si,offset write1 ;Pongo posicion de la rutina a realizar con el disquete

write1:
mov ax,0301h ;Servicio 03H para escribir en disco
mov cx,0001h ;Pista 0, primer sector
mov dh,00h ;Pista 0
mov dl,0 ;Unidad donde escribiremos, Torre "A"
mov bx,offset bootEXEC ;Datos a escribir, en realidad es el BOOT SECTOR personlizado
int 13h ;Interrupcion del BIOS que permite el acceso al disco
jnc exitDOS ;Salta si no hay error

mov bx,offset mensb5 ;Mensaje a Imprimir si no se puede realizar la escritura
jmp errorINdisk ;Rutina que trata de recalibrar el disco para luego escribir



exitDOS:
mov bx,offset mensE7 ;Si salta aqui es que ya se ha escrito correctamente
;el boot sector o sector de arranque personalizado

print: ;Rutina para Imprimir Una cadena en Pantalla
mov ah,09h ;Servico 09H de la interrupcion 21H del S.O
push cs ;Segmento DS debe apuntar al segmento donde esta mi cadena
pop ds
mov dx,bx ;En DX debe estar el puntero donde comienza la cadena
int 21h ;Interrupcion multiple del S.O para varios propositos

exit:
mov ax,4c00h ;Servicio que le indica al S.O que la aplicacion ha finalizado
int 21h

flagDISK db 3 ;Variable para controlar intentos de repeticion de una operacion

mensE7 db 0ah,0dh,' Disco con Arranque Personalizado:',0ah,0dh
mensE8 db ' Ya puede reiniciar su Ordenador, recuerde que debe establecer en su SETUP',0ah,0dh
mensE9 db 'la opcion de arrancar por Unidad A o disquete...',0ah,0dh,'$'

mensx db 0ah,0dh,' ERROR:',0ah,0dh
mensx1 db ' Imposible leer. No hay disco en la Unidad A: o sectores da$ados...',0ah,0dh,'$'

mensb5 db 0ah,0dh,' ERROR:',0ah,0dh
mensb4 db ' Imposible escribir. Disco Protegido contra escritura o sectores da$ados...',0ah,0dh,'$'


;----------------------------------------------------------------------------
bootEXEC:
;reservo 512 bytes para el programa que estar en el
;boot sector, el cual imprimira en pantalla las teclas que pulse
;y saldra para arrancar por su disco duro con la tecla ESCAPE "ESC"


jmp boot ;Cuando esto es escrito en el boot sector de su disquete
;y es cargado por el BIOS en el arranque de su ordenador
;esta es la primera instruccion a ejecutar por la CPU
;SALTAMOS, pues los bytes restantes es el area de datos
;utilizadas por el S.O para saber que tipo de disco es

;reservo los datos de gu!a para el DOS

reservados:
r1 dw 0
r2 dw 0
r3 dw 0
r4 dw 0
r5 dw 0
r6 dw 0
r7 dw 0
r8 dw 0
r9 dw 0
r10 dw 0
r11 dw 0
r12 dw 0
r13 dw 0
r14 dw 0
r15 dw 0
r16 dw 0
r17 dw 0
r18 dw 0
r19 dw 0
r20 dw 0
r21 dw 0
r22 dw 0
r23 dw 0
r24 dw 0
r25 dw 0
r26 db 0



boot:
cli ;Desactivo las interrupciones.
xor si,si ;Posiciono el segmento de pila en el segmento 0000
mov ss,si
mov sp,7c00h ;Posiciono el puntero de pila(SP) en 7C00H y el puntero base(BP)
mov bp,7c00h
sti ;Activo las interrupciones. Esto en realidad se hace
;por un motivo, pero es largo de explicar.

mov ds,si ;Apunto mi segmento de datos(DS) y extra(ES) a 0000
mov es,si

mov ax,0003h
int 10h ;Con esto pondr el modo texto 80X25


mov ah,02h ;Posiciona el cursor en fila 0 columna 0
mov bh,0
mov dx,0100h
int 10h ;Interrupcion de video que permite estas funciones

mov dx,7c00h+(offset Welcome-offset bootEXEC) ;Imprimo Mensaje de Bienvenida en pantalla
mov cx,0000h
call PrintString ;Subrutina que permite imprimir una cadena en pantalla

readKEY:
xor ah,ah ;Leo el teclado hastya que pulsen una tecla
int 16h ;Interrupcion que permite leer el teclado

cmp al,00h ;Comparo el tipo de tecla que devuelve al pulsarlas
je readKEY ;Si no es tecla imprimible en pantalla,entonces no se imprime


mov ah,0eh ;Imprimo en pantalla el caracter correspondiente a la tecla pulsada
int 10H

cmp al,1bh ;Controlo si la tecla pulsada es "ESC"
jne readKEY ;De no serlo, sigo leyendo el teclado e imprimiendo

mov dx,7c00h+(offset GoodBye-offset bootEXEC)
mov cx,1400h
call PrintString ;Como se pulso la tecla "ESC", entonces imprimo mensaje
;de despedida.

xor ah,ah ;Espero a que presionen una tecla para volver a la
int 16h ;secuencia de arranque del BIOS de su ordenador

int 19h ;Esta interrupcion es la que invoca la secuencia de
;arranque del BIOS de su ordenador

PrintString: ;Imprime una cadena directamente en pantalla
mov ax,0b800h ;En CX fila y columna
mov es,ax ;en DX puntero al comienzo de la cadena
;la cadena debe terminar en '$'
Push cs
pop ds

mov ax,160
mul ch

shl cl,1
xor ch,ch

add ax,cx

mov di,ax
mov si,dx

cld

again_PrintString:
lodsb
cmp al,'$'
je exit_PrintString
mov ah,1fh
stosw
jmp again_PrintString


exit_PrintString:
ret

GoodBye db 'Retire el disqute y presione una tecla para cargar su Sistema '
GoodBye1 db 'Operativo...$'

Welcome db 'Ya puede teclear el texto que desee, Para salir, presione ESC$'

final db 0

inicio endp
alfa ends
end inicio


/////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////

ahora, consigue un compilador y un linkeador

suerte y no seas tan recortero!!!

salu2!!!

Ñuño Martínez
26-12-2006, 13:29:20
hola fide, disculpa si te ofendo, pero por tus anteriores posts, se me ha ocurrido hacerte una pregunta:

¿alguna vez has estado en alguna escuela para retrasados mentales?

Creo que te has pasado, aeff.

Yo diría, más bien, que está estudiando informática y que no atiende en clase.

aeff
26-12-2006, 15:08:00
realmente están un poco pasaditas mis anteriores palabras, pero antes de hacer una pregunta como esta, me dedicaría a aprender un poco más de informática, y ver al menos por arribita las limitaciones de un lenguaje, además, creo que fide tiene que hacer preguntas con mas coherencias.

salu2!!!

fide
31-12-2006, 20:05:31
Alberto Enrique Franco Ferreiro, te puedo pedir un favor????????

Cuan do veas un hilo publicado por mí, preferiría que lo que tengas que decirme me lo digas en la escuela si es que me puedes ayudar ¿¿¿¿Ok????

Recuerda que no tengo la suerte de haber comenzado a programar desde los 6 años y haberme dedicado a hacer eso solamente teniendo PC en mi casa y con un padre que programa desde los años 70 como tu.

Si mis preguntas te parecen estúpidas, por que las respondes??????

Bueno, que pases un buen fin de año con tu familia, y te deseo lo mejor. Pero cambia hermano, recuerda que dios es grande y no siempre te tendrá del lado de arriba.

Chao...