elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


  Mostrar Mensajes
Páginas: 1 [2] 3 4 5 6 7 8 9 10
11  Programación / ASM / Re: S.O.S No funciona mi bootloader !!!! en: 24 Junio 2013, 21:55 pm
x64Core tiene razon, demasiadas preguntas sin sentido y respuestas idem. No tenes bases, por eso no comprendes lo que hace tu main, leelo de nuevo y si seguis sin comprender olvidate de hacer un bootloader y primero aprende a hacer un programa en assembly.

Estuve estudiandome varios manuales tanto de asm con S.O como asm sin S.O
Por lo visto parece que tengo que leer mucho mas ...
12  Programación / ASM / Re: S.O.S No funciona mi bootloader !!!! en: 24 Junio 2013, 21:47 pm
¿Y despues del main ejecutas msgTexto?

Punto 1.
He visto bootloaders "hola mundo" que lo ponen despues de main
Punto 2
¿ ejecutar msgTexto ???
usando msgTexto db "unacadena" , lo que haces es incrustar unacadena en el fichero resultante , es algo propio de nasm y creo que tu usas masm. Como la BIOS carga los 512 primeros bytes , tambien cargará en algun sitio del segmento de datos la cadena hola mundo , y luego la idea es que una vez en memoria recorrer todos los caracteres. de todos modos probaré lo que tu dices
13  Programación / ASM / Re: S.O.S No funciona mi bootloader !!!! en: 24 Junio 2013, 20:35 pm
Has depurado el codigo?  :rolleyes:

Hay 2 problemas

1. Yo lo que hago cuando programo bootloaders es usar unas directivas nasm
que dejan el fichero en 512 bytes y le agregan la firma bootloader , y luego lo pruebo en una maquina virtual. Pero yo no se de ningun "depurador para maquina virtual"
2. Llevo 3 semanas aprendiendo ASM , y como en C la vida era de color rosa no necesitaba debuggers. Asi que nunca me dio por aprender a usarlos y no tengo ni idea de depurar  :(
14  Programación / ASM / [SOLUCIONADO] No funciona mi bootloader !!!! en: 24 Junio 2013, 20:02 pm
Hola a todos  , estoy tipeando un bootloader en asm , pero esto me tiene ya medio calvo. No se donde puede estar el fallo , no tengo la mas remota idea !!!
Os paso el codigo
Código
  1. [BITS 16]
  2. [ORG 0x07C] ; Uno de los fallos estaba aqui , puse mal esta direccion
  3.  
  4. ; Entry point
  5. jmp main
  6.  
  7. ; Rutinas
  8. putchar:
  9. ; He comprobado que la rutina putchar funciona perfectamente , no la revises
  10. ; Imprime el caracter guardado en el registro al
  11. mov ah , 0x0E
  12. mov bh , 0x00
  13. mov bl , 0x07
  14. int 10h
  15. retn
  16.  
  17. putstr:
  18. ; Y el otro fallo estaba aqui , que no me asegure de que lodsb incrementara SI
  19.                ; Abajo del post esta el codigo corregido
  20. lodsb ; Lee 1 caracter del string
  21. cmp al , 0x00
  22. jz retornar
  23. call putchar
  24. jmp putstr
  25. retornar:
  26. retn
  27. main:
  28. ; El problema PUEDE estar aqui
  29. mov si , msgTexto
  30. call putstr
  31.  
  32. ; Declaraciones
  33. msgTexto db 0x0D, 0x0A, "Hola mundo!!", 0x00 ; El mensaje
  34.  
  35. ; Firma bootloader
  36. times 510-($-$$) db 0
  37. dw 0xAA55
  38.  

No comprendo donde esta el problema , como dato os digo que ni se mueve el cursor :( Muchas gracias de antemano


La solucion fue esta :
1 ) Corregi el valor de ORG , que lo puse mal por un error de tipeo
2 ) Como solucion temporal hasta que maneje bien lods y familia , hice un mov al , [DS:SI]. Luego antes de repetir el bucle incremento SI para pasar al siguiente caracter y por fin resuelto !!!!!!!!!!!!!!!!!!!!!!!(10^9000 exclamaciones)!!!!!!!!!!!!!!!!!!!!

Os dejo el codigo corregido :)

Código
  1. [BITS 16]
  2. [ORG 0x7C00] ; Este es el org correcto
  3.  
  4. ; Entry point
  5. jmp main
  6.  
  7. ; Rutinas
  8. putchar:
  9. ; Imprime el caracter guardado en el registro al
  10. mov ah , 0x0E
  11. mov bh , 0x00
  12. mov bl , 0x07
  13. int 10h
  14. retn
  15.  
  16. putstr:
  17. cld ; Asi me aseguro de que lodsb incremente SI
  18.                lodsb
  19. or al , al
  20. jz retornar
  21. call putchar
  22. jmp putstr
  23. retornar:
  24. retn
  25. main:
  26. mov si , msgTexto
  27. call putstr
  28.  
  29. ; Declaraciones
  30. msgTexto db 0x0D, 0x0A, "Hola mundo!!", 0x00 ; El mensaje
  31.  
  32. ; Firma bootloader
  33. times 510-($-$$) db 0
  34. dw 0xAA55
  35.  

Nota : Lo se usar cld para asegurarme de que lodsb incremente SI ha posteado por cpu2
15  Programación / ASM / Re: ¿ Que pinta aqui el registro si ? en: 24 Junio 2013, 17:55 pm
Por la pregunta y la formulación me dio esa sensación.

La instrucción lods es muy eficiente, para conseguir códigos más potentes tienes que hacer cosas poco habituales.

Si, en este caso las dos son iguales de buenas, un ejemplo si yo estoy programando una shellcode prefiero el or, así no dejo bytes núlos, todo depende de lo que estes haciendo y tú estilo claro.

Un saludo.

Tienes razon. La proxima vez intentare formular la pregunta de otro modo ;)
16  Programación / ASM / Re: ¿ Que pinta aqui el registro si ? en: 24 Junio 2013, 15:43 pm
SI es el primer argumento de la función DisplayMessage. No mueve una cadena si no la dirección que apunta a esa cadena.

Lo que hace ese lodsb es copiar el primer byte del contenido de la dirección de si a al.
Y luego depende de como este la bandera DF se incrementa o decrementa la dirección de si, que en tú caso es incrementar.

Se imprime dicho carácter si no es NULL con la interrupción 0x10, si es NULL se salta a .DONE y si no pues sigue el ciclo de lodsb.

Si no entiendes algo más del código ya sabes, pero no sé porque empiezas con algo tan avanzado se nota que no entiendas nada.

Un saludo.

No se trata de nada muy avanzado , de hecho llevo 3 semanas aprendiendo ensamblador y ya habia visto bootloaders antes. Lo que pasa es que el que escribio el codigo lo hizo de una manera poco habitual , muchos otros bootloaders 'hola mundo' usaban otro metodo que no implica lodsb. Por ejemplo cuando comprueba si el caracter es cero con
Código
  1. or al , al
  2. jz .DONE
  3.  

otro modo de hacerlo igual de valido es

Código
  1. cmp al , 0
  2. jz .DONE
  3.  

Lo que quiero decir con esto es que hay muchas maneras de hacer las cosas , y cada programador tiene su estilo propio , que puede que a otros no les parezca claro y vean otro modo mas simple de hacerlo.
Aclarado esto ultimo  , te doy las gracias :)
17  Programación / ASM / [SOLUCIONADO] ¿ Que pinta aqui el registro si ? en: 24 Junio 2013, 13:30 pm
Hola , estoy estudiando el codigo fuente de un bootloader y me he dado cuenta de una cosa , que luego os cuento despues de poner el codigo
Código
  1.    [BITS 16]        ; Directiva. Indica al compilador NASM que nuestro programa es un binario de 16 bits.
  2.    ORG 0            ; Directiva que indica que queremos comenzar el programa al principio de la memoria.
  3.    ; Podemos iniciarlo directamente en la direccion 7Ch y saltarnos lo siguiente, aunque mejor no hacerlo asi.
  4.    main:
  5.    ; Ajustamos los registros para que vayan a la direccion 7Ch
  6.    cli
  7.    mov     ax, 0x07C0
  8.    mov     ds, ax
  9.    mov     es, ax
  10.    mov     fs, ax
  11.    mov     gs, ax
  12.    ; Creamos una pila de llamada
  13.    mov     ax, 0×0000
  14.    mov     ss, ax
  15.    mov     sp, 0xFFFF
  16.    sti
  17.    mov si, msgTexto                             ; Cargamos en el registro si el texto
  18.    call DisplayMessage                         ; Llamamos a la subrutina para mostrar el texto
  19.  
  20.    DisplayMessage:                                     ; Subrutina para mostrar un texto cargado en el
  21.    ;registro “si”
  22.    lodsb                                       ; cargamos el siguiente caracter de la cadena de caract.
  23.    or      al, al                              ; comprobamos que no hay un caracter nulo, en cuyo caso…
  24.    jz      .DONE                                 ; … lo interpretamos como final de linea, por lo que termina la subrutina.
  25.    mov     ah, 0x0E                            ; Le pedimos a la BIOS que muestre el texto
  26.    mov     bh, 0×00                            ; Pagina 0
  27.    mov     bl, 0×07                            ; Atributo de texto
  28.    int     0×10                                ; Interrupcion 10: mostrar el texto en pantalla
  29.    jmp     DisplayMessage                         ; Si no hemos terminado, repetimos
  30.    .DONE:
  31.    jmp Loop                                     ; Si hemos terminado, creamos un bucle infinito para bloquear el ordenador
  32.    Loop:
  33.    jmp Loop
  34.    msgTexto db 0x0D, 0x0A, “Hola mundo!!”, 0×00     ; Nuestro mensaje
  35.    times 510-($-$$) db 0
  36.    dw 0xAA55
  37.  

Lo que no comprendo es que en la linea 17 como va a mover un string al registro si ?? Este codigo funciona , pero yo lo intente por mi lado sin usar la instruccion lodsb y me sale un caracer raro. Estoy desconcertado , no comprendo como mueve un string a un registro  , ¿¿¿??? Alguien me explica como narices hace el autor de este codigo para mostrar el mensaje ????? Muchas gracias :)
18  Programación / ASM / Re: Por que se habla tanto del 8086 ? en: 24 Junio 2013, 12:22 pm
Jajajaja no tenian mejor nombre que RIP ?
Gracias Eternal! Ya estare molestando si surgen dudas ( Es casi un hecho )

Ojo con la ortografia ;)
19  Programación / ASM / [SOLUCIONADO] ¿ Necesario segmento y desplazamiento en 32 bits ? en: 22 Junio 2013, 23:38 pm
Bueno hola a todos , he estado leyendo mucho por internet del tema , y mi pregunta es esta : En un procesador de 16 bits ( 8086 ) o en procesadores posteriores en modo real , al tener solo 16 bits con un solo registro podrias direccionar solo 64 kb. La solucion que propuso intel fue usar segmento y desplazamiento , es decir 2 registros. por ejemplo , en 16 bits para saber por que instruccion vas , necesitas usar CS:IP. La cuestion es que creo que en 32 bits puedes usar EIP directamente , y en 64 bits RIP. En resumen ¿ En 32 bits es necesario segmento y desplazamiento para direccionar mas de 64kb de memoria ? Creo que no por lo que he leido , pero me gustaria que me lo confirmasen definitivamente. Muchas gracias :)


EI: juntando mensajes.

Me autorespondo : Por compatibilidad con anteriores procesadores se puede usar segmento:desplazamiento , pero normalmente no hace falta cambiar de segmento ya que en 32 bits son de 4gb , muy grandes
20  Programación / ASM / Re: ¿ Por qué DB ? en: 22 Junio 2013, 22:05 pm
Declara byte a byte lo que esta dentro de las comillas, y sin olvidarte del cero, que esta separado con una coma.

Eso se puede hacer así:

Código
  1. .byte 0x48,0x6f,0x6c,0x61,0x20,0x6d,0x75,0x6e,0x64,0x6f,0x00  ; .long equivale a DB

Esto se podría también hacer de esta forma:

Código
  1. a: .long 0x616c6f48  ; DD
  2. b: .word 0x6d20,0x6e75  ; DW
  3. c: .byte 0x64,0x6f,0x00  ; DB

Puedes hacerlo de muchas formas, igualmente los bytes serán cargados en memoria.

Un saludo.

Muchas gracias por responder , es decir que si me ha quedado claro es el propio programa ensamblador el que sustituye la definicion de un string por la de todos sus caracteres. Tambien me he dado cuenta de que la manera de declararlas varia de un ensamblador a otro ( de nasm a gas por ejemplo ) Tambien me he dado cuenta de que te lo incrusta en el archivo , ya que por ejemplo el bootloader que estoy estudiando usa la directiva times para rellenar con ceros hasta los 510 bytes. luego agrega los 2 ultimos bytes de firma bootloader. Como la bios carga 512 bytes asi tendrias cargado el string en memoria para hacer lo que proceda. Muchas gracias me ha sido de ayuda tu respuesta :)
Páginas: 1 [2] 3 4 5 6 7 8 9 10
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines