Duda con bootsect.s - Linux

Iniciado por Vaagish, 12 Diciembre 2013, 18:24 PM

0 Miembros y 1 Visitante están viendo este tema.

_Enko

#10
mh... creo que te estas confundiendo de lo que verdaderamente hace un org.

Te  conviene leer un poco mas de teoria, porque yo ya no la tengo presente en mi memoria xD

2)
Para llegar a los 510 bytes tendrias que hacer algo tipo:

db  510 - $;  dup 0
dw  0xAA55

mh... son 510 mas 2 bytes de la firma de un bootloader.

3)El inicio podria ser algo como:
use16
 org   0
 jmp  0x07C0:start
start:
 mov  ax, cs
 mov  ds, ax
 mov  es, ax



Citarestoy en masm32
NOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO

eso no te sirve, ensambla para windows unicamente.

Necesitas un ensamblador que ensamble codigo de 16bit.
No se si masm16 serviria....

fasm, nasm segurisimo.



Vaagish

Bueno, al final lo solucione así:

Código (asm) [Seleccionar]

.model TINY

.code
_Main:

mov ax, 7C00h ; CARGAR EN 7C00H
mov ds, ax
mov ax, 1301h ; FUNCION 13, MODO 01
mov bx, 000Ah ; PAGINA 00, COLOR 10 (VERDE CHILLON)
mov cx, 11 ; TAMAÑO DEL STRING
mov dx, 0202h ; FILA 02, COLUMNA 02
push cs
pop es
mov bp, _MSG ; DIRECCION DEL STRING
int 10h ; INTERRUPCION DEL BIOS

_MSG:
db "Cargando...", 0
SinUsar BYTE 474 dup(?)

_Exit:
db 55h
db 0AAh

end _Main


Citarestoy en masm32
NOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO

Si, la verdad que todos los ejemplos estan en Nasm o Fasm,, pero ahora me da terrible pereza pasarme de sintaxis, aunque lo voy a tener que hacer.. Masm32 ensambla de 16 Bits si,, y/o linkea también,, (con link16.exe), despues hay que pasar eso por otra herramienta que es exe2bin (para sacar código binario, sin cabeceras de windows) mucho mas complicado que otros ensambladores,, pero bueno,, es la costumbre..

Bueno,, la cosa es que ahora funciona! (A medias) lo que hago es generar ese binario de 512 bytes, después abro un disco de la unidad A: con un visor hexadecimal, y en el sector 0 del disquette le meto el binario,, meto el disquette en la pc y la inicio ( tengo veintipico de PC's para hacer pruebas :p ) la cosa es que lo lee!!! (EA! EA! EA!!!) pero me imprime cualquier cosa menos "Cargando..." me salen unos caracteres raros,, como si la codificación no fuese la correcta por así decirlo.. ) Sugerencias??

Gracias man!

cpu2

El registro %bp esta concatenado con el segmento %ss, creo que hay puede estar el problema.

Si te soy sincero no lo entiendo de el todo, pero estoy leyendo los codigos del nucleo, y el segmento %ss lo dejan en cero, creo que el procesador multiplicaba el valor del segmento por 16 y luego sumaba la direccion o algo asi, pruebalo no puedo decirte mas, pero si no muestra los caracteres buenos seguro que es porque no esta apuntando bien.

Un saludo.

Vaagish

#13
CitarEl registro %bp esta concatenado con el segmento %ss, creo que hay puede estar el problema.

Sip, todo el **** día y no lo resuelvo aun.. pero le saque el push y el pop (para ver que pasaba) y salen otros caracteres,, o sea que apunta a otro lado ahora.. lo voy a resolver, esto no va a quedar así  >:(

Saludos!!




EDITO: Aca debe estar la solucion,, pero ya tengo 8hs de continuo con esto y no doy mas,, lo sigo cuando me lea esto:

Citar
http://stackoverflow.com/questions/4903906/assembly-using-the-data-segment-register-ds
http://wiki.osdev.org/Real_Mode
http://www.internals.com/articles/protmode/realmode.htm

cpu2

Primero tienes que leer las funciones de cada segmento, veras que se concatenan con los registros, yo revisaria el push y el pop a esos segmentos y estate seguro de lo que estas haciendo.

Tu dijiste que no mostraban los caracteres correctos, bien el problema puede ser por el segmento %ss, que es usado por el stack %esp y %ebp, como estas en 16 bits %sp y %bp.

E leido esos papers que citas, veras la formula que tiene la CPU para calcular los offsets, si el segmento %ss tiene algun valor o lo que sea, apuntara mal.

Este comentario es casi como el anterior pero es para que veas. Como el codigo no es muy extenso es facil de buscar los problemas, los parametros no son, asi que seguro que son los segmentos, si no es el %ss sera otro ves comprobando, asi lo entienderas todo.

Un saludo.

Vaagish

#15
CitarPrimero tienes que leer las funciones de cada segmento, veras que se concatenan con los registros, yo revisaria el push y el pop a esos segmentos y estate seguro de lo que estas haciendo.

Si, evidentemente me falta mucho,, estuve leyendo un poco esos enlaces, y otros,, al final me pase a nasm,, (en realidad no tiene mucha diferencia y se pueden usar los dos) el asunto es que con nasm se puede usar esto por ejemplo:

Código (asm) [Seleccionar]
jmp 07C0h:_MAIN
   mov ax, cs ; ''
   mov ds, ax ; ''
   mov es, ax ; ''


y con eso queda solucionado.. igual me falta aprender mucho sobre los segmentos, y sobre asm en general.. pero bue, de a poco..

ACTUALIZACIÓN:

Para MASM hacer:
Código (asm) [Seleccionar]

org 0
mov ax, 07C0h
; Update the segment registers
mov ds, ax ; ''


Para NASM:
Código (asm) [Seleccionar]

[BITS 16] ; Ensamblar en 16 Bits
[ORG 0]

jmp 07C0h:_MAIN     ; Saltar el hilo principal a la posicion 07C0h

_MAIN:
; Update the segment registers
   mov ax, cs ; ''
   mov ds, ax ; ''
   mov es, ax ; ''


Felicidades a todos en las fiestas! Gracias por las ayudas! Saludos!!  ;D