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
[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 :)
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.
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
or al , al
jz .DONE
otro modo de hacerlo igual de valido es
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 :)
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.
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 ;)