【问题标题】:What are the AT&T equivalents to these Intel assembler directives?这些英特尔汇编器指令的 AT&T 等效项是什么?
【发布时间】:2018-09-23 02:11:44
【问题描述】:

在一些用 Intel 语法编写的示例代码中,有一行写着 [org 0x7c00]。我似乎无法弄清楚如何让它与 AT&T 语法一起工作,也无法在网上找到它。

另外,我发现一行包含$$(这可能不被视为汇编程序指令)。据我所知,这引用了二进制文件的开头(?)我似乎也找不到与此等效的 AT&T。

问一个更广泛的问题。找到与(模糊?)英特尔声明的 AT&T 等价物的好方法是什么?

【问题讨论】:

  • 如果您直接使用as 进行组装,然后使用链接器ld 将您的对象链接到可执行文件,那么org 0x7c00 是通过ld 命令行选项-Ttext=0x7c00 完成的.或者,您可以使用链接器脚本,但这更复杂
  • 您使用什么命令来制作引导加载程序?如果您没有链接,那么您可能缺少一个步骤,导致创建不正确的引导扇区。
  • 可以使用gcc在一个命令中完成链接、编译和输出二进制文件。这是你在做什么吗?
  • 那么您就少了一个步骤。 as 输出一个目标文件。如果没有链接步骤,objcopy 将获取您的 elf 对象并在不设置原点的情况下输出它,这会让您感到非常痛苦。通常你可以做类似as --32 boot.s -o boot.old -melf_i386 -Ttext=0x7c00 boot.o -o boot.elf然后你可以使用objcopy和objcopy -O binary boot.elf boot.binboot.bin将是你可以用作引导加载程序的文件

标签: assembly x86-64 gnu-assembler att


【解决方案1】:

at&t 语法中的 org 是 . =,所以:

. = 0x7c00
.globl _a
_a: ret

编译后,nm 产生:

0000000000007c00 T _a

但是因为ld和dos工具不同,你可能得不到你想要的效果;那是进一步的重定位可能会应用于_a,所以它最终会是这样的:

0000000100000000 T __mh_execute_header
0000000100007fac T _a
0000000100000390 T _main

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-01
    • 2021-02-06
    • 2012-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多