如何使用GNU汇编程序(as)将程序集文件编译为原始二进制文件(如DO
我想在
Windows中编译这个源代码(这只是一个例子):
start: NOP NOP 当我用NASM或FASM编译它时,输出文件长度是2个字节.但是当我用GNU汇编程序(as)编译它时,输出文件长度是292字节! 如何使用GNU汇编程序(as)将程序集文件编译为原始二进制文件(如DOS .com)格式? 为什么我这样做? 我想编写自己的简单操作系统,用C编写代码(不使用任何C标准库,甚至是stdio.h或math.h)并将其转换为汇编: gcc -S my_os.c -o my_os.asm -masm=intel 然后,我将汇编文件编译为原始二进制文件: as my_os.asm 然后我将a.out(汇编程序的输出)重命名为my_os.flp,最后用VMWare启动我的操作系统:) 解决方法
ld –oformat binary
对于快速和肮脏的测试,您可以: as -o a.o a.S ld --oformat binary -o a.out a.o hd a.out 得到: 00000000 90 90 |..| 00000002 不幸的是,这给出了警告: ld: warning: cannot find entry symbol _start; defaulting to 0000000000400000 二进制没有多大意义.它可能会沉默: .section .text .globl start start: nop nop 和: ld -e start --oformat binary -o a.out a.o 或者只是: ld -e 0 --oformat binary -o a.out a.o 告诉ld入口点不是_start而是地址0的代码. 令人遗憾的是,既不是ld也不能从stdin / stdout获取输入/输出,所以没有管道. 适当的引导扇区 如果你想要更严肃的事情,最好的方法是生成一个干净的最小链接描述文件. linker.ld: SECTIONS { . = 0x7c00; .text : { *(.*) . = 0x1FE; SHORT(0xAA55) } } 这里我们还将魔术字节放在链接器脚本中. 首先,链接器脚本在重定位后控制输出地址非常重要.了解有关搬迁的更多信息,请访问:https://stackoverflow.com/a/30507725/895245 用它作为: as -o a.o a.S ld --oformat binary -o a.img -T linker.ld a.o 然后你可以启动: qemu-system-i386 -hda a.img 此存储库中的工作示例:https://github.com/cirosantilli/x86-bare-metal-examples/blob/d217b180be4220a0b4a453f31275d38e697a99e0/Makefile 测试了Binutils 2.24,Ubuntu 14.04. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- cmd删除文件命令del/erase和删除目录命令rmdir/r
- windows-server-2008-r2 – Windows事件日志中超
- windows-8 – 如何在Visual Studio Express 2012
- Windows – SSH RC4密码:究竟有什么风险?
- 是否可以对.NET应用程序中的用户dpi设置做出反应
- 第一课:windows提权-快速查找exp
- batch-file – 在DOS批处理不工作中比较2个数字
- 故意破坏我的Windows应用程序的最佳方法是什么?
- windows-installer – 将installscript转换为Bas
- Windows上的PHP中的异步popen exec