История изменений
Исправление 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!)
Со скриптами линковщика, коряво конечно выглядит. Интересно, есть ли способ избавиться от них.