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

时间:2012-12-28 06:30:35

标签: 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 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时(我在精灵上运行它,但我验证它的代码与此相同):

00008000 <_start>:
8000:   55                      push   ebp
8001:   89 e5                   mov    ebp,esp
8003:   a1 70 90 00 00          mov    eax,ds:0x9070
8008:   bb 00 00 00 00          mov    ebx,0x0
800d:   cd 01                   int    0x1
800f:   a1 74 90 00 00          mov    eax,ds:0x9074
8014:   bb 00 00 00 00          mov    ebx,0x0
8019:   cd 01                   int    0x1
801b:   b8 00 00 00 00          mov    eax,0x0
8020:   5d                      pop    ebp
8021:   c3                      ret    

正如您所看到的,文本无处可寻。我希望它会做这样的事情:string db "Hi!", 0我会用nasm做。

我应该怎么做才能将输出文件夹中的字符包含在汇编中? 提前谢谢。

2 个答案:

答案 0 :(得分:4)

二进制可执行文件通常分为几个部分。您的字符串只是放在与代码不同的部分。这是有道理的,因为代码应该是只读的,但字符串已被声明为非const和volatile。

答案 1 :(得分:1)

我想出了怎么做。 首先,我创建了一个这样的链接器脚本(您可以将phys更改为您想要加载它的地址):

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