NASM组织指令是否有GCC版本?
我目前正在制作一个操作系统,当我尝试添加C支持时,我遇到了一点问题。。。在汇编中,我的操作系统上的每个程序都以ORG 32768开始,这是NASM编译器的预处理器指令,用于抵消代码的起源,但我似乎找不到任何方法使用GCC编译器实现这一点。因此,我的问题是,如何使用GCC抵消C中代码的起源?是的,我在询问之前已经查过了,甚至查过了ORG和.ORG。回到以前,你用汇编编写程序,不一定需要链接器 gnu工具根本不支持它 开始NASM组织指令是否有GCC版本?,c,gcc,assembly,nasm,C,Gcc,Assembly,Nasm,我目前正在制作一个操作系统,当我尝试添加C支持时,我遇到了一点问题。。。在汇编中,我的操作系统上的每个程序都以ORG 32768开始,这是NASM编译器的预处理器指令,用于抵消代码的起源,但我似乎找不到任何方法使用GCC编译器实现这一点。因此,我的问题是,如何使用GCC抵消C中代码的起源?是的,我在询问之前已经查过了,甚至查过了ORG和.ORG。回到以前,你用汇编编写程序,不一定需要链接器 gnu工具根本不支持它 开始 .globl _start _start: mov $0xA000,
.globl _start
_start:
mov $0xA000,%rsp
callq fun
jmp .
.globl _start
_start:
mov $0xA000,%rsp
mov $0x7,%eax
add $0x1,%eax
jmp .
乐趣
fun.ld
MEMORY
{
ram : ORIGIN = 0x8000, LENGTH = 0x2000
}
SECTIONS
{
.text : { *(.text*) } > ram
.rodata : { *(.rodata*) } > ram
.data : { *(.data*) } > ram
.bss : { *(.bss*) } > ram
}
生成命令
as start.s -o start.o
gcc -O2 -nostdlib -nostartfiles -ffreestanding -c fun.c -o fun.o
ld -T fun.ld start.o fun.o -o fun
它产生了这个程序:
0000000000008000 <_start>:
8000: 48 c7 c4 00 a0 00 00 mov $0xa000,%rsp
8007: e8 04 00 00 00 callq 8010 <fun>
800c: eb fe jmp 800c <_start+0xc>
800e: 66 90 xchg %ax,%ax
0000000000008010 <fun>:
8010: b8 07 00 00 00 mov $0x7,%eax
8015: c3 retq
与上面相同的链接器脚本
as start.s -o start.o
ld -T fun.ld start.o -o fun
生产
0000000000008000 <_start>:
8000: 48 c7 c4 00 a0 00 00 mov $0xa000,%rsp
8007: b8 07 00 00 00 mov $0x7,%eax
800c: 83 c0 01 add $0x1,%eax
800f: eb fe jmp 800f <_start+0xf>
ORG和.ORG可以追溯到您在汇编中编写程序而不一定需要链接器的时代 gnu工具根本不支持它 开始
.globl _start
_start:
mov $0xA000,%rsp
callq fun
jmp .
.globl _start
_start:
mov $0xA000,%rsp
mov $0x7,%eax
add $0x1,%eax
jmp .
乐趣
fun.ld
MEMORY
{
ram : ORIGIN = 0x8000, LENGTH = 0x2000
}
SECTIONS
{
.text : { *(.text*) } > ram
.rodata : { *(.rodata*) } > ram
.data : { *(.data*) } > ram
.bss : { *(.bss*) } > ram
}
生成命令
as start.s -o start.o
gcc -O2 -nostdlib -nostartfiles -ffreestanding -c fun.c -o fun.o
ld -T fun.ld start.o fun.o -o fun
它产生了这个程序:
0000000000008000 <_start>:
8000: 48 c7 c4 00 a0 00 00 mov $0xa000,%rsp
8007: e8 04 00 00 00 callq 8010 <fun>
800c: eb fe jmp 800c <_start+0xc>
800e: 66 90 xchg %ax,%ax
0000000000008010 <fun>:
8010: b8 07 00 00 00 mov $0x7,%eax
8015: c3 retq
与上面相同的链接器脚本
as start.s -o start.o
ld -T fun.ld start.o -o fun
生产
0000000000008000 <_start>:
8000: 48 c7 c4 00 a0 00 00 mov $0xa000,%rsp
8007: b8 07 00 00 00 mov $0x7,%eax
800c: 83 c0 01 add $0x1,%eax
800f: eb fe jmp 800f <_start+0xf>
你可以通过使用链接器脚本来设置代码的去向,但我不知道用C来归档代码的任何方法。你不能用C来实现这一点。如果你在NASM中使用二进制格式,那么你将得到同样的效果,你将需要像MikeCAT说的那样使用链接器脚本。您还需要编写自己的C启动代码,然后如果您想使用它,您需要移植C库。@MikeCAT谢谢,我以前没有手工制作过自己的链接器脚本,不需要,我在汇编中编写了内核,但是我相信我可以用谷歌的出色功能来解决这个问题。@RossRidge我已经移植了足够多的C库,可以用C编写一个基本的hello world程序,但是我很欣赏这个建议,通过C启动代码,你到底指的是什么?初始化C库然后调用main的代码。这是C程序开始执行的地方。你可以通过使用链接器脚本来设置代码的去向,但我不知道用C来存档代码的任何方法。你不能从C来完成这项工作。如果你在NASM中使用二进制格式,那么你将得到同样的效果,你将需要像MikeCAT所说的那样使用链接器脚本。您还需要编写自己的C启动代码,然后如果您想使用它,您需要移植C库。@MikeCAT谢谢,我以前没有手工制作过自己的链接器脚本,不需要,我在汇编中编写了内核,但是我相信我可以用谷歌的出色功能来解决这个问题。@RossRidge我已经移植了足够多的C库,可以用C编写一个基本的hello world程序,但是我很欣赏这个建议,通过C启动代码,你到底指的是什么?初始化C库然后调用main的代码。这是C程序开始执行的地方。谢谢!这帮了大忙:谢谢!这非常有帮助: