【发布时间】:2023-03-08 02:50:02
【问题描述】:
我正在为自己的类 C 语言 (x86-64) 制作自己的编译器。但我很困惑如何编译另一种语言的 sn-p,即 x86-64 程序集,例如:
int main() {
__asm {
mov rcx, rsp
call func
}
}
一旦遇到 __asm,它必须以某种方式将标记更改为程序集标记,如果我在 __asm 块之外有一个名为 rcx 的变量怎么办?将其合并到类 C 编译器设计中的好方法是什么?您将如何对其进行标记并以将其与类 C 代码分开的方式对其进行解析? __asm 块将首先在解析器级别上被识别,但如果没有对其进行标记,您将无法达到该级别....
【问题讨论】:
-
既然您知道这有多么棘手,请重新考虑支持内联汇编 :) 对于超低级别的东西,他们总是可以 link 与在别处定义的汇编函数。
-
您应该创建一个集成/统一两种语言的语法。如果你不知道这两种语言是什么,你将无法解析。
-
您可以将汇编代码放在一个字符串中,然后将其传递给汇编器进行解析。
-
分词器能否将整个区块视为单个分词? prl 关于放入字符串文字的建议具有类似的效果,因为字符串是单个标记。 gcc 会这样做。
-
由于 MSVC 确实以这种方式实现 asm,您是否调查过当您有本地(或更糟糕的全局)变量时会发生什么情况?或
clang -fasm-blocks。我现在有点好奇他们是如何处理那个角落的。在解析级别,我们只知道它以某种方式工作(也许按照 Nate 的建议跳到结尾的}),但是在实际使用寄存器与 C var 方面发生的事情可能很有趣。
标签: parsing compiler-construction x86-64 inline-assembly language-design