LINUX.ORG.RU

История изменений

Исправление EXL, (текущая версия) :

Да, ради интереса погуглил – нашёл такой способ (отсюда):

$ cat main.c
asm(".code16gcc");

__asm__("jmpl $0x0000, $main\n");

void cout(const char* str) {
    while(*str) {
        __asm__ __volatile__("int $0x10" : : "a"(0x0e00 | *str), "b"(0x0007));
        ++str;
    }
}

void main() {
    __asm__ __volatile__ ("xor %ax, %ax\n");
    __asm__ __volatile__ ("mov %ax, %ds\n");
    cout("Hello World!");
    __asm__ __volatile__("cli\n");
    __asm__ __volatile__("hlt\n");
}

$ gcc -m16 -c main.c -o main.o

$ cat boot.ld 
ENTRY(main);
SECTIONS {
    . = 0x7C00;
    .text : AT(0x7C00) {
        *(.text);
    }
    .sig : AT(0x7DFE) {
        SHORT(0xaa55);
    }
}

$ ld -melf_i386 -static -Tboot.ld -nostdlib --nmagic -o boot.elf main.o

$ objcopy -O binary boot.elf main.bin

$ qemu-system-x86_64 main.bin
(Hello, World!)

https://habrastorage.org/webt/cl/qf/cz/clqfcz4ldh2kkdimvelwirwiypq.png

Со скриптами линковщика коряво конечно выглядит. Интересно, есть ли способ избавиться от них.

Исправление EXL, :

Да, ради интереса погуглил – нашёл такой способ (отсюда):

$ cat main.c
asm(".code16gcc");

__asm__("jmpl $0x0000, $main\n");

void cout(const char* str) {
    while(*str) {
        __asm__ __volatile__("int $0x10" : : "a"(0x0e00 | *str), "b"(0x0007));
        ++str;
    }
}

void main() {
    __asm__ __volatile__ ("xor %ax, %ax\n");
    __asm__ __volatile__ ("mov %ax, %ds\n");
    cout("Hello World!");
    __asm__ __volatile__("cli\n");
    __asm__ __volatile__("hlt\n");
}

$ gcc -m16 -c main.c -o main.o

$ cat boot.ld 
ENTRY(main);
SECTIONS {
    . = 0x7C00;
    .text : AT(0x7C00) {
        *(.text);
    }
    .sig : AT(0x7DFE) {
        SHORT(0xaa55);
    }
}

$ ld -melf_i386 -static -Tboot.ld -nostdlib --nmagic -o boot.elf main.o

$ objcopy -O binary boot.elf main.bin

$ qemu-system-x86_64 main.bin
(Hello, World!)

Со скриптами линковщика коряво конечно выглядит. Интересно, есть ли способ избавиться от них.

Исправление EXL, :

Да, ради интереса погуглил – нашёл такой способ (отсюда):

$ cat main.c
asm(".code16gcc");

__asm__("jmpl $0x0000, $main\n");

void cout(const char* str) {
    while(*str) {
        __asm__ __volatile__("int $0x10" : : "a"(0x0e00 | *str), "b"(0x0007));
        ++str;
    }
}

void main() {
    __asm__ __volatile__ ("xor %ax, %ax\n");
    __asm__ __volatile__ ("mov %ax, %ds\n");
    cout("Hello World!");
    __asm__ __volatile__("cli\n");
    __asm__ __volatile__("hlt\n");
}

$ gcc -m16 -c main.c -o main.o

$ cat boot.ld 
ENTRY(main);
SECTIONS {
    . = 0x7C00;
    .text : AT(0x7C00) {
        *(.text);
    }
    .sig : AT(0x7DFE) {
        SHORT(0xaa55);
    }
}

$ ld -melf_i386 -static -Tboot.ld -nostdlib --nmagic -o boot.elf main.o

$ objcopy -O binary boot.elf main.bin

$ qemu-system-x86_64 main.bin
(Hello, World!)

Со скриптами линковщика, коряво конечно выглядит. Интересно, есть ли способ избавиться от них.

Исправление EXL, :

Да, ради интереса погуглил – нашёл такой способ (отсюда):

$ cat main.c
asm(".code16gcc");

__asm__("jmpl $0x0000, $main\n");

void cout(const char* str) {
    while(*str) {
        __asm__ __volatile__("int $0x10" : : "a"(0x0e00 | *str), "b"(0x0007));
        ++str;
    }
}

$ gcc -m16 -c main.c -o main.o

void main() {
    __asm__ __volatile__ ("xor %ax, %ax\n");
    __asm__ __volatile__ ("mov %ax, %ds\n");
    cout("Hello World!");
    __asm__ __volatile__("cli\n");
    __asm__ __volatile__("hlt\n");
}

$ cat boot.ld 
ENTRY(main);
SECTIONS {
    . = 0x7C00;
    .text : AT(0x7C00) {
        *(.text);
    }
    .sig : AT(0x7DFE) {
        SHORT(0xaa55);
    }
}

$ ld -melf_i386 -static -Tboot.ld -nostdlib --nmagic -o boot.elf main.o

$ objcopy -O binary boot.elf main.bin

$ qemu-system-x86_64 main.bin
(Hello, World!)

Со скриптами линковщика, коряво конечно выглядит. Интересно, есть ли способ избавиться от них.

Исходная версия EXL, :

Да, ради интереса погуглил – нашёл такой способ:

$ cat main.c
asm(".code16gcc");

__asm__("jmpl $0x0000, $main\n");

void cout(const char* str) {
    while(*str) {
        __asm__ __volatile__("int $0x10" : : "a"(0x0e00 | *str), "b"(0x0007));
        ++str;
    }
}

$ gcc -m16 -c main.c -o main.o

void main() {
    __asm__ __volatile__ ("xor %ax, %ax\n");
    __asm__ __volatile__ ("mov %ax, %ds\n");
    cout("Hello World!");
    __asm__ __volatile__("cli\n");
    __asm__ __volatile__("hlt\n");
}

$ cat boot.ld 
ENTRY(main);
SECTIONS {
    . = 0x7C00;
    .text : AT(0x7C00) {
        *(.text);
    }
    .sig : AT(0x7DFE) {
        SHORT(0xaa55);
    }
}

$ ld -melf_i386 -static -Tboot.ld -nostdlib --nmagic -o boot.elf main.o

$ objcopy -O binary boot.elf main.bin

$ qemu-system-x86_64 main.bin
(Hello, World!)

Со скриптами линковщика, коряво конечно выглядит. Интересно, есть ли способ избавиться от них.