加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

如何使用GNU汇编程序(as)将程序集文件编译为原始二进制文件(如DO

发布时间:2020-12-14 01:55:32 所属栏目:Windows 来源:网络整理
导读:我想在 Windows中编译这个源代码(这只是一个例子): start:NOPNOP 当我用NASM或FASM编译它时,输出文件长度是2个字节.但是当我用GNU汇编程序(as)编译它时,输出文件长度是292字节! 如何使用GNU汇编程序(as)将程序集文件编译为原始二进制文件(如DOS .com)格式
我想在 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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读