gpt4 book ai didi

c - 使用 `GCCs` 预处理器作为汇编程序

转载 作者:太空狗 更新时间:2023-10-29 15:26:58 26 4
gpt4 key购买 nike

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

假设您可以使用所有当前的 attributes#pragmasgcc 对创建汇编程序有什么限制,不包括翻译性能(编译/汇编到二进制时间)?

我说的不是 .

 #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()
};

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

我想这可能与“你可以用汇编器做一些你不能用 shell code 做的事”有关。 '.

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

最佳答案

我认为 XY Problem是错误的描述。问题更多的是“需要概念A来评估概念B”。


概念 A:什么是汇编程序?

参见:Assemblers and Loader , 大卫所罗门。 [一些智慧之珠,一些陈旧的琐事]

I very quickly discovered the lack of literature in this field. In strict contrast to compilers, for which a wide range of literature exists, very little has ever been written on assemblers and loaders.

一个汇编器包括,

  • A Symbol table便于通过某种对象格式进行链接。
  • LexerParser用于将文本转换为数据结构或直接转换为机器代码。
  • Does 2 passes用于最有效的分支和子例程调用。
  • 一个操作码表。

汇编程序通常是一个 1-1翻译。但是,通常会存在多种分支和调用变体;通常称为 版本。使用的操作码将取决于到目的地的距离;需要一个两遍编译器来优化前向分支。Harold 提到


概念 B:使用“C”预处理器作为汇编器。

最好的“C”预处理器可以模拟的是 1-pass 汇编器。一大类CPU/指令可以这样编码;尽管宏可能很麻烦。不会有列表外部参照,但大多数人不会错过这些功能。此外,由于预处理器的限制,语法会很奇怪。处理地址修正将很困难,因为标签要么通过使用指针或手工编码来重新使用“C”符号表#define用于标签偏移量。这将此方法限制为除 basic block 之外的任何内容。 .

大型汇编程序

YUV/RGB 转换或 MP3 解码等大型汇编程序不太可能以这种方式使用。

多架构代码

多架构代码很常见。例如,ARM wifi 芯片可能会将其代码作为固件嵌入到 Linux 内核中。这种技术可能在这里很有用。但是,针对不同的体系结构使用单独的编译器/汇编器,然后使用 objcopy嵌入它们要明智得多。

自修改代码

这可能是最有用的。事实上,许多工具,例如链接器和加载器都具有高级功能,可以在运行时修补代码。它还可以用于在运行时有条件地更改例程;函数指针几乎一样快,也更容易理解,更不用说缓存一致性问题了。

另请参阅:Gold Blog , Ian Lance Taylor。 [尽管他使用<templates> ]

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com