gcc -c -ffreestanding -mtune=i386 -m32 startup.s gdt.s idt.s main.c asmFunctions.s
ld -mi386linux --oformat binary -melf_i386 -o kernel -T LDkernelScript
Переход на си
Какой - нибудь Hello World на си и как его скомпилировать\слинковать в бинарный файл? Какой компилятор юзать? Си знаю плохо, вот хочу подучить =)
Переход в защищенный режим:
Код:
.code16
movw $0x1000, %ax
movw %ax, %ds
movb %dl, bdisk
movb $0, %ah
movb $2, %al
int $0x10
movb $1, %ah
movb $0x20, %ch
int $0x10
movw $0x5000, %ax
movw %ax, %ss
movw $0, %sp
cli
call rmodeInitGDT
call rmodeInitIDT
call rmodeInitMainTSS
movl %cr0, %eax
orw $1, %ax
movl %eax, %cr0
jmp $(8*16), $0x0 // Сразу включается многозадачность - это переключение на описываемый ниже mainTSS
.globl bdisk
bdisk: .byte 0
rmodeInitMainTSS:
movw $0x6000, %ax
movw %ax, %es
movb $0, %al
movw $0xffff, %cx
call rmodeMemfill
movw $main, %es:0x420 /* EIP main */ // Обрати внимание на эту строку. Здесь main - указатель на сишную функцию, на которую осуществляется переход. Подставляется при линковке.
movw $0, %es:0x422 /* EIP main */
movw $0xfff, %es:0x438 /* ESP main */
movw $0, %es:0x43a /* ESP main */
movw $8, %es:0x44c /* CS main */
movw $24, %es:0x450 /* SS main */
movw $16, %es:0x454 /* DS main */
movb $4, %es:0x4a1
movw $0x270, %bx
movw $mainNameSize, %cx
movw $mainName, %ax
call rmodeMemcopy
ret
mainName: .string "main"
mainNameSize = .-mainName
.globl rmodeMemfill
rmodeMemfill:
/* al - value
es:bx - dest
cx - size */
loopBfill:
movb %al, %es:(%bx)
inc %bx
loop loopBfill
ret
.globl rmodeMemcopy
rmodeMemcopy:
/* ds:ax - src
es:bx - dest
cx - size */
loopBcopy:
movb (%eax), %dh
movb %dh, %es:(%bx)
inc %ax
inc %bx
loop loopBcopy
ret
movw $0x1000, %ax
movw %ax, %ds
movb %dl, bdisk
movb $0, %ah
movb $2, %al
int $0x10
movb $1, %ah
movb $0x20, %ch
int $0x10
movw $0x5000, %ax
movw %ax, %ss
movw $0, %sp
cli
call rmodeInitGDT
call rmodeInitIDT
call rmodeInitMainTSS
movl %cr0, %eax
orw $1, %ax
movl %eax, %cr0
jmp $(8*16), $0x0 // Сразу включается многозадачность - это переключение на описываемый ниже mainTSS
.globl bdisk
bdisk: .byte 0
rmodeInitMainTSS:
movw $0x6000, %ax
movw %ax, %es
movb $0, %al
movw $0xffff, %cx
call rmodeMemfill
movw $main, %es:0x420 /* EIP main */ // Обрати внимание на эту строку. Здесь main - указатель на сишную функцию, на которую осуществляется переход. Подставляется при линковке.
movw $0, %es:0x422 /* EIP main */
movw $0xfff, %es:0x438 /* ESP main */
movw $0, %es:0x43a /* ESP main */
movw $8, %es:0x44c /* CS main */
movw $24, %es:0x450 /* SS main */
movw $16, %es:0x454 /* DS main */
movb $4, %es:0x4a1
movw $0x270, %bx
movw $mainNameSize, %cx
movw $mainName, %ax
call rmodeMemcopy
ret
mainName: .string "main"
mainNameSize = .-mainName
.globl rmodeMemfill
rmodeMemfill:
/* al - value
es:bx - dest
cx - size */
loopBfill:
movb %al, %es:(%bx)
inc %bx
loop loopBfill
ret
.globl rmodeMemcopy
rmodeMemcopy:
/* ds:ax - src
es:bx - dest
cx - size */
loopBcopy:
movb (%eax), %dh
movb %dh, %es:(%bx)
inc %ax
inc %bx
loop loopBcopy
ret
Компиляция:
Код:
Код:
OUTPUT_FORMAT("binary")
SECTIONS {
output : {
startup.o
gdt.o
idt.o
main.o
asmFunctions.o
}
}
SECTIONS {
output : {
startup.o
gdt.o
idt.o
main.o
asmFunctions.o
}
}
Пример на GCC.
Код:
#include <stdio.h>
int main(void) {
const char* s = "Hello World !!!";
puts(s);
// вывод "Hello World !!!" на встроенном ASM
// синтаксис AT&T
asm("movl %0, %%esi"::"d"(s));
asm("push %esi");
asm("call puts");
asm("add $4, %esp");
getchar();
return 0;
}
int main(void) {
const char* s = "Hello World !!!";
puts(s);
// вывод "Hello World !!!" на встроенном ASM
// синтаксис AT&T
asm("movl %0, %%esi"::"d"(s));
asm("push %esi");
asm("call puts");
asm("add $4, %esp");
getchar();
return 0;
}
Код:
#include <stdio.h>
int main(void)
{
const char* s = "Hello World !!!";
puts(s);
// пример вывода "Hello World !!" на встроенном ASM
// синтаксис-INTEL
__asm {
mov esi, s
push esi
call puts
add esp, 4
};
getchar();
return 0;
}
int main(void)
{
const char* s = "Hello World !!!";
puts(s);
// пример вывода "Hello World !!" на встроенном ASM
// синтаксис-INTEL
__asm {
mov esi, s
push esi
call puts
add esp, 4
};
getchar();
return 0;
}