Тогда почему у меня не работает? Если я уберу
ELF, тогда у меня не будет рассчитан адрес для вызова функции.
Вот мой код.
boot.asm:
Код:
use16
org 0x7C00
boot__code16:
mov AX,CS
mov DS,AX
mov ES,AX
mov FS,AX
mov GS,AX
mov SS,AX
mov AX,boot_stack16_start
mov SP,AX
mov AH,0x02
mov AL,10 ; Количество читаемых секторов
mov CL,2 ; Сектор
mov CH,0 ; Цилиндр
mov DH,0 ; Головка
mov DL,0 ; Диск
mov BX,boot__continuation
int 0x13
jmp boot__continuation
boot__stack16:
db 0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0
boot_stack16_start:
db 0,0,0,0,0,0,0,0
rb 510-($-$$)
db 0x55,0xAA
boot__continuation:
preparation.asm:
Код:
format ELF
use32
extrn '_kernel' as kernel
call kernel
main.c:
Код:
void kernel(void)
{
int a=0;
int b=0;
int c=0;
a=2;
b=3;
c=a+b;
}
И собираю:
Код:
@echo on
fasm boot.asm boot.bin
fasm preparation.asm preparation.o
gcc -ffreestanding -c -o main.o main.c
ld --oformat=binary -o Test.img preparation.o main.o
pause
В ответ:
Код:
D:\01>fasm boot.asm boot.bin
flat assembler version 1.69.29 (985305 kilobytes memory)
3 passes, 512 bytes.
D:\01>fasm preparation.asm preparation.o
flat assembler version 1.69.29 (985271 kilobytes memory)
1 passes, 348 bytes.
D:\01>gcc -ffreestanding -c -o main.o main.c
D:\01>ld --oformat=binary -o Test.img preparation.o main.o
ld: cannot perform PE operations on non PE output file 'Test.img'.
D:\01>pause
Для продолжения нажмите любую клавишу . . .
Вот я и озадачен. Я сначала хотел переход в защищённый режим писать на
C-коде, а тут оказывается что я даже просто на 32-битный
C-код перейти не могу.