有各种开源汇编程序,例如 gasnasmyasm 。它们有不同的 pseudo-opsmacro 语法。对于许多开源项目,汇编器经过预处理以替换常量和平台条件。

假设您可以使用所有当前 gccattributes ,不包括翻译性能(编译/汇编到二进制时间),那么 #pragmas 创建汇编器会有什么限制?

我不是在谈论 inline-assembly

 #define MOV(RA,RB)  (OXFEB10000UL | RA << 16 | RB)
 #define ADD(RA,RB)  (OXFEB20000UL | RA << 16 | RB)
 #define RET         (OXFEB7ABCDUL)

 unsigned long add4[] __attribute(section(".text")) =
 {
    ADD(R0,R1),
    ADD(R2,R3),
    MOV(R1,R2),
    ADD(R0,R1),
    RET()
 };

我相信使用指针算法可以模拟 . 和其他 labels 。也许这是一个 XY problem ;我试图理解为什么有这么多的汇编程序。似乎一切都可以由预处理器完成,而汇编器确实是程序员的偏好;或者我遗漏了一个技术限制。

我想这可能与“你可以用汇编器做而你不能用 shell code 做的事情”有关。

编辑: 我已将其从 C 重新标记为编译器。我对汇编程序的技术细节感兴趣。它是简单的 1-1 翻译并发出重定位(如编译器将)还是更多?我的意思不是让人们像我上面概述的那样编写汇编程序。我试图了解汇编程序在做什么。我不相信有 龙书 供汇编程序使用。当然,预处理器不能自己创建binary,需要额外的机器;它只翻译文本。

最佳答案



很多。 我们使用汇编器进行组装和使用 C 预处理器进行预处理是有原因的。

首先,正如您自己刚刚展示的那样,您不能使用普通的汇编程序语法,无论是 Intel 还是 AT&T 风格。你必须使用那些丑陋的括号。

其次,您所谈论的那些 __attribute__ 指令与预处理器无关,它甚至无法识别它们。它们是 编译器的提示, 和编译器将依次生成由这些属性(或不)引导的汇编代码。



这是肯定的。



出于同样的原因,存在各种类型的编程语言、编译器、汽车和衣服:一种工具并不适合所有人的需求。人们是不同的,他们用他们的工具链做不同的事情,他们发现一个比另一个更容易使用(如果不需要 AT&T 语法,我个人会使用 GNU 汇编程序,我只是不能支持),等等。

关于c - 使用 `GCCs` 预处理器作为汇编器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15465958/

10-15 17:58