[SOLUCIONADO] ¿ Que pinta aqui el registro si ?

Iniciado por lucaslopez0000, 24 Junio 2013, 13:30 PM

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

lucaslopez0000

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 (asm) [Seleccionar]

   [BITS 16]        ; Directiva. Indica al compilador NASM que nuestro programa es un binario de 16 bits.
   ORG 0            ; Directiva que indica que queremos comenzar el programa al principio de la memoria.
   ; Podemos iniciarlo directamente en la direccion 7Ch y saltarnos lo siguiente, aunque mejor no hacerlo asi.
   main:
   ; Ajustamos los registros para que vayan a la direccion 7Ch
   cli
   mov     ax, 0x07C0
   mov     ds, ax
   mov     es, ax
   mov     fs, ax
   mov     gs, ax
   ; Creamos una pila de llamada
   mov     ax, 0×0000
   mov     ss, ax
   mov     sp, 0xFFFF
   sti
   mov si, msgTexto                             ; Cargamos en el registro si el texto
   call DisplayMessage                         ; Llamamos a la subrutina para mostrar el texto

   DisplayMessage:                                     ; Subrutina para mostrar un texto cargado en el
   ;registro "si"
   lodsb                                       ; cargamos el siguiente caracter de la cadena de caract.
   or      al, al                              ; comprobamos que no hay un caracter nulo, en cuyo caso...
   jz      .DONE                                 ; ... lo interpretamos como final de linea, por lo que termina la subrutina.
   mov     ah, 0x0E                            ; Le pedimos a la BIOS que muestre el texto
   mov     bh, 0×00                            ; Pagina 0
   mov     bl, 0×07                            ; Atributo de texto
   int     0×10                                ; Interrupcion 10: mostrar el texto en pantalla
   jmp     DisplayMessage                         ; Si no hemos terminado, repetimos
   .DONE:
   jmp Loop                                     ; Si hemos terminado, creamos un bucle infinito para bloquear el ordenador
   Loop:
   jmp Loop
   msgTexto db 0x0D, 0x0A, "Hola mundo!!", 0×00     ; Nuestro mensaje
   times 510-($-$$) db 0
   dw 0xAA55


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 :)
La manera mas simple de solucionar los problemas de windows , los virus , el spyware , la basura de microsoft en general

USA LINUX

cpu2

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.

lucaslopez0000

Cita de: cpu2 en 24 Junio 2013, 15:06 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 (asm) [Seleccionar]

or al , al
jz .DONE


otro modo de hacerlo igual de valido es

Código (asm) [Seleccionar]

cmp al , 0
jz .DONE


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 :)
La manera mas simple de solucionar los problemas de windows , los virus , el spyware , la basura de microsoft en general

USA LINUX

cpu2

Cita de: The C Coder en 24 Junio 2013, 15:43 PM
No se trata de nada muy avanzado , de hecho llevo 3 semanas aprendiendo ensamblador y ya habia visto bootloaders antes.

Por la pregunta y la formulación me dio esa sensación.

Cita de: The C Coder en 24 Junio 2013, 15:43 PMLo 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.

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

Cita de: The C Coder en 24 Junio 2013, 15:43 PMLo 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.

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.

lucaslopez0000

Cita de: cpu2 en 24 Junio 2013, 17:34 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 ;)
La manera mas simple de solucionar los problemas de windows , los virus , el spyware , la basura de microsoft en general

USA LINUX