这是我的新内核代码,它应该打印a(顺便说一下,之所以叫printstack是因为我想通过堆栈传递参数,但没有成功)。
void printstack(char in){ /*print function*/
asm ("mov ah,0x0e\n"
"mov al,%0\n"
"int 0x10\n"
::"r"(in)
);
}
void main(){ /*kernel entry point*/
printstack('a');
}
但是当我在QEMU中测试时,它只打印了空格。
下面是建立os.flp的完整脚本。
echo ">>> Creating floppy image..."
mkdosfs -C os.flp 1440 || exit
echo ">>> Assembling bootloader..."
nasm -O0 -w+orphan-labels -f bin -o source/bootload/bootload.bin source/bootload/bootload.asm || exit
echo "compiling kernel"
gcc -c ./source/kernel.c -masm=intel
ld --oformat binary kernel.o -o ./source/kernel.bin -e main
echo ">>> Adding bootloader to floppy image..."
dd status=noxfer conv=notrunc if=source/bootload/bootload.bin of=os.flp || exit
echo ">>> Copying kernel"
rm -rf tmp-loop
mkdir tmp-loop && mount -o loop -t vfat os.flp tmp-loop && cp source/kernel.bin tmp-loop/
sleep 0.2
echo ">>> Unmounting loopback floppy..."
umount tmp-loop || exit
rm -rf tmp-loop
t
echo '>>> Done!'
我通过调换main和printstack的位置解决了这个问题。
void main(){
printstack('a');
}
void printstack(char in){
asm volatile("mov ah,0x0e\n"
"mov al,%0\n"
"int 0x10\n"
::"r"(in)
:"eax"
);
}