Código
BITS 16 start: xor ax, ax ; Set data segment to where we're loaded mov ds, ax mov ax, text_string add ax, 7C00h mov si, ax ; Put string position into SI call print_string ; Call our string-printing routine jmp $ ; Jump here - infinite loop! text_string: db 'This is my cool new OS!', 0 print_string: ; Routine: output string in SI to screen mov ah, 0Eh ; int 10h 'print char' function .repeat: lodsb ; Get character from string cmp al, 0 je .done ; If char is zero, end of string int 10h ; Otherwise, print it jmp .repeat .done: ret times 510-($-$$) db 0 ; Pad remainder of boot sector with 0s dw 0xAA55
Es un código sencillito, pero funciona. El problema está en que si hago que el registro DS valga 0x07C0, el ordenador no arranca con esta unidad de arranque, pero si calculo manualmente la dirección de la cadena de texto y hago que DS valga 0, el ordenador si que arranca con esta unidad.
Código con el que funciona:
Código
BITS 16 start: xor ax, ax ; Lo ponemos como 0 mov ds, ax mov ax, text_string ; Calculo manualmente la dirección de la caedna add ax, 7C00h mov si, ax ; La guardo en SI ...
Código con el que no funciona:
Código
BITS 16 start: mov ax 0x07C0 ; Lo ponemos como 0 mov ds, ax mov ax, text_string ; El cálculo debería ser DS * 0x10 + SI, lo que es lo mismo que ; 0x07C0 * 0x10 + SI, lo que es lo mismo que 0x7C00 + SI, que ; a su vez es lo mismo que el cálculo manual antes expuesto mov si, ax ; La guardo en SI ...
O hay algo que se me escapa, o es muy extraño todo... Gracias de antemano!
Vale, me he dado cuenta de que xor limpia parte/todo el registro FLAGS
He obtenido el registro con LAHF. Antes de usar xor, LAHF retornaba, en binario, 01000110, y después de usar xor, LAHF retornaba 00000000. He intentado hacer lo siguiente, pero sigue sin funcionar:
Código
mov ah, 0x00 SAHF CLC CLD CLTS mov ax, 0x07C0 mov ds, ax
Pero con este código si que funciona (algo hace XOR de lo que no me doy cuenta...):
Código
xor ax, ax ; Algo más tiene que hacer XOR, porque aun reemplazando el valor de ax, sin XOR no funciona mov ax, 0x07C0 ; Aquí reemplazamos todo ax mov ds, ax
Espero que me puedan ayudar