Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

 
 
Herramientas Buscar en Tema Desplegado
  #3  
Antiguo 26-12-2006
Avatar de aeff
aeff aeff is offline
Miembro
 
Registrado: oct 2006
Ubicación: Cuba, Guantánamo
Posts: 348
Poder: 20
aeff Va camino a la fama
Angry ayyyyyyyyyy mamcita!!!

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!!!

Última edición por aeff fecha: 26-12-2006 a las 03:20:17.
Responder Con Cita
 


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Assembler desde delphi lookmydoom Varios 3 30-06-2006 21:56:20
assembler y el señor delphi fcran Varios 2 26-06-2006 11:32:14
Mover datos al LPT1 con Assembler en XP Fralva Varios 3 08-08-2005 15:02:13
Fuentes assembler o .asm Leomedellin Varios 7 19-04-2005 07:09:33
assembler en delphi fcran Varios 4 23-05-2003 07:35:44


La franja horaria es GMT +2. Ahora son las 17:24:46.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi