让C用汇编炒锅

Getting C to wok with assembly

本文关键字:汇编      更新时间:2024-09-23

我在一个简单的操作系统上工作,在过去的三周里,我一直在调试一个错误,这个错误只有当我在程序集中调用c++或c代码时才会出现,qemu(我使用的模拟器(会开始闪烁,并且不会加载代码。我已经在其他模拟器中尝试过了。

"Bootloader.asm";

[org 0x7c00]
mov ah, 0x00
mov al, 0x03
int 0x10
mov [Boot_Disk], dl

mov bp, 0x7c00
mov sp, bp

call DiskRead

jmp Program_Space

jmp $

%include "ReadDisk.asm"


times 510 - ($ - $$) db 0 ;fills the rest of the bytes till byte 510 with 0s
db 0x55 ;sets the last 2 bytes to 0x55 and 0xaa, so the bios knows its bootable
db 0xaa

"Sector2.asm";

jmp Enable32BitMode
%include "gdt.asm"
Enable32BitMode:
call enable_A20
cli ;disables interupts
lgdt [gdt_descriptor]
mov eax, cr0 
or eax, 1       ; set PE (Protection Enable) bit in CR0 (Control Register 0)
mov cr0, eax
jmp codeseg:Start32Bit

enable_A20:
in al, 0x92
or al, 2
out 0x92, al
ret       

[bits 32]
;[extern _start]
Start32Bit:
mov ax, dataseg ;moves dataseg (found in gdt, into registers ds to gs)
mov ds, ax
mov ss, ax
mov es, ax
mov fs, ax
mov gs, ax
;mov [0xb8000], byte 'h'
;  call _start
jmp $
times 2048 - ($-$$) db 0 ;fills the disk with 2kb of 0's

"ReadDisk.asm";

Program_Space equ 0x7e00

DiskRead:
mov ah, 0x02 
mov bx, Program_Space 
mov al, 4 ;amount of sectors to read
mov dl, [Boot_Disk] 
mov ch, 0x00 ; 
mov dh, 0x00 ; 
mov cl, 0x02 ;

int 0x13

";ReadText.cpp";


extern "C" void _start() {
return;
}

我的编译器选项(linux(:

nasm Bootloader.asm -f bin -o Bootloader.bin 
nasm Sector2.asm -f elf32 -o Sector2.o
gcc -ffreestanding -m32 -mno-red-zone -march=i686 -c "Kernel.c" -o "ReadText.o" # -m32
ld -m elf_i386 -o Kernel.tmp -Ttext 0x7e00 Sector2.o ReadText.o
objcopy -O binary Kernel.tmp Kernel.bin 
cat Bootloader.bin Kernel.bin > Bootloader.flp

c代码的不一致性:

Disassembly of section .text:

00000000 <_start>:
0:   f3 0f 1e fb             endbr32 
4:   55                      push   %ebp
5:   89 e5                   mov    %esp,%ebp
7:   90                      nop
8:   5d                      pop    %ebp
9:   c3                      ret    

like@jester评论了您的问题。您似乎将引导程序编译为.code32。您的CPU(qemu或任何其他VM(不会启动它,因为CPU最初运行在16位模式下。请看这里-JOS引导程序。这是一个极简主义的引导程序,你可以从中学习。

我发现了错误,我没有读取包含C代码的扇区,如果您正在读取这个问题,请确保您正在读取所有扇区。