Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在平面二进制文件中包含字符数组的内容_C_Assembly_Embedded_Inline Assembly_Osdev - Fatal编程技术网

C 在平面二进制文件中包含字符数组的内容

C 在平面二进制文件中包含字符数组的内容,c,assembly,embedded,inline-assembly,osdev,C,Assembly,Embedded,Inline Assembly,Osdev,我使用平面二进制文件作为操作系统的外部程序。当我编译它们时,就像这样: gcc -Wall ctest.c -o ctest.bin -nostdlib -Wl,-Ttext=0x8000,-nostdlib -masm=intel objcopy -O binary -j .text ctest.bin ctest 但这样做时,字符数组的内容不会放入文件中。这是我的代码: static volatile char string[4] = "Hi!\0"; static volatile ch

我使用平面二进制文件作为操作系统的外部程序。当我编译它们时,就像这样:

gcc -Wall ctest.c -o ctest.bin -nostdlib -Wl,-Ttext=0x8000,-nostdlib -masm=intel
objcopy -O binary -j .text ctest.bin ctest
但这样做时,字符数组的内容不会放入文件中。这是我的代码:

static volatile char string[4] = "Hi!\0";
static volatile char string2[15] = "Hello, World!\n\0";

int _start()
{
    asm("mov eax, [string]");
    asm("mov ebx, 0x00");
    asm("int 0x01");
    asm("mov eax, [string2]");
    asm("mov ebx, 0x00");
    asm("int 0x01");
    return 0;
}
当我运行objdump时(我在elf上运行了它,但我验证了它的代码与此相同):

00008000:
8000:55推式ebp
8001:89 e5 mov ebp,esp
8003:a1 70 90 00 mov eax,ds:0x9070
8008:BB00 mov ebx,0x0
800d:cd 01 int 0x1
800f:a1 74 90 00 mov eax,ds:0x9074
8014:BB00 mov ebx,0x0
8019:cd 01 int 0x1
801b:B800 mov eax,0x0
8020:5d pop ebp
8021:c3 ret
正如你所看到的,文本不见踪影。我希望它能做这样的事情:
stringdb“Hi!”,0
,我会用nasm来做

我应该怎么做才能在输出bin文件中包含字符,而不在程序集中对其进行编码?

提前感谢。

二进制可执行文件通常分为多个部分。您的字符串只是被放置在与代码不同的部分中。这是有意义的,因为代码应该是只读的,但是字符串被声明为非常量和易失性的。

我找到了方法。 首先,我创建了这样一个链接器脚本(您可以将
phys
更改为您希望加载它的任何地址):

然后编译并链接可执行文件,如下所示:

gcc -m32 -nostdlib -nostdinc -fno-builtin -o exec.o exec.c
ld -T link.ld -melf_i386 -o exec.bin exec.o

添加了一些更有用的tags@GrijeshChauhan谢谢,但这真的符合嵌入式吗?因为这是在普通PC上运行的。是的,但我添加了这样的内容,以便可以注意到为嵌入式系统工作的人。我想他们也可以在这个问题上帮助你:)@GrijeshChauhan:这不是只检查文件吗?我在任何地方都找不到用它来创建二进制文件的方法。你给objdump加了什么标志?在做objcopy之前/同时,有没有办法强迫它们进入相同的部分(我想是文本?@farlepet:你可以在
objcopy
参数中添加
-j.data
来将字符串转换成二进制文件。@MichaelBurr:当我这样做的时候,文本和数据部分之间有4000字节的间隔,有没有办法不手动删除该间隔?@farlepet,尝试只声明字符串
const
并删除
volatile
。它们的去向仍取决于编译器,但它们被放在文本部分的几率会增加。@Markransem:我试过了,但没有将它们包含在.text部分,现在当我将objcopy与-j.data一起使用时,它不会在文本部分后添加任何内容
OUTPUT_FORMAT("binary")
ENTRY(start)
phys = 0x8000;
SECTIONS
{
  .text phys : AT(phys) {
    code = .;
    *(.text)
    *(.rodata)
    . = ALIGN(0);
  }
  .data : AT(phys + (data - code))
  {
    data = .;
    *(.data)
    . = ALIGN(0);
  }
  .bss : AT(phys + (bss - code))
  {
    bss = .;
    *(.bss)
    . = ALIGN(0);
  }
  end = .;
}
gcc -m32 -nostdlib -nostdinc -fno-builtin -o exec.o exec.c
ld -T link.ld -melf_i386 -o exec.bin exec.o