让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代码的扇区,如果您正在读取这个问题,请确保您正在读取所有扇区。
相关文章:
- 为什么我的C++程序的程序集输出充满了 .ascii,没有汇编代码?
- 在 emscripten 网页汇编正在运行期间更新进度条?
- 为什么我们不编写可以处理C++标识符的汇编器和链接器?
- 在什么情况下,我想在 C/C++ 代码中使用内联汇编代码
- 为什么 memcpy() 和其他类似的函数使用汇编?
- [[可能]]和[[不太可能]]影响程序汇编的简单示例?
- 为什么 MSVC C++编译器将一个简单的 Hello World 扩展为 4000 行汇编?
- 英特尔汇编与内部函数,AVX
- 这个x86汇编代码是如何接收和存储子程序返回的数据的
- Capstone cs_disasm仅反汇编一小部分代码
- C++和汇编中的对数
- 卤化物:X86汇编代码生成
- C++:汇编代码包含断言结果
- 在 g++4.4.7 中为复数算术生成快速汇编
- 混合 c++ 和汇编不能将多个参数从C++函数传递到程序集
- 如何使用 gcc 内联汇编器代码访问成员变量
- SSE 内联汇编和可能的 g++ 优化错误
- C++汇编代码分析(使用 clang 编译)
- 设置Qt Creator以链接和编译汇编代码
- 在Cython中使用移动方法时的汇编误差