我目前正在使用llvm编写一个编译器项目.我已经按照各种教程进行操作,以便我有一个解析器来创建语法树,然后使用提供的IRBuilder将树转换为llvm模块.
我的目标是创建一个可执行文件,我很困惑,接下来该做什么.我发现的所有教程都创建了llvm模块并使用Module.dump()打印出程序集.另外,我能找到的唯一文档是llvm开发人员,而不是项目的最终用户.
如果我想生成机器代码,接下来的步骤是什么?llvm-mc项目看起来可能会做我想要的,但我找不到任何类型的文档.
也许我期待自己会做一些事情.我的期望是我可以构建一个模块,然后会有一个我可以使用模块调用的API,并且将生成一个目标三元组和一个目标文件.我找到了关于生成JIT的文档和示例,我对此并不感兴趣.我正在寻找如何生成编译的二进制文件.
我正在研究OS X,如果这有任何影响.
在这个编译器输出中,我试图理解nopw指令的机器码编码是如何工作的:
00000000004004d0 <main>:
4004d0: eb fe jmp 4004d0 <main>
4004d2: 66 66 66 66 66 2e 0f nopw %cs:0x0(%rax,%rax,1)
4004d9: 1f 84 00 00 00 00 00
Run Code Online (Sandbox Code Playgroud)
在http://john.freml.in/amd64-nopl上有一些关于"nopw"的讨论.任何人都可以解释4004d2-4004e0的含义吗?从查看操作码列表,似乎66 ..代码是多字节扩展.我觉得我可能会得到一个比这更好的答案,除非我试图在几个小时内查看操作码列表.
asm输出来自C中的以下(疯狂)代码,它优化为简单的无限循环:
long i = 0;
main() {
recurse();
}
recurse() {
i++;
recurse();
}
Run Code Online (Sandbox Code Playgroud)
编译时gcc -O2,编译器识别无限递归并将其转换为无限循环; 它实际上做得很好,事实上,它实际上是在main()没有调用recurse()函数的情况下循环.
编者注:带NOP的填充函数并不特定于无限循环.在Godbolt编译器资源管理器中,这是一组具有一系列NOP长度的函数.
我想生成一个可以加载到内存中的文件(例如with mmap),然后跳转到该内存的开头运行代码.
理想情况下,我希望选择使代码可重定位(可能效率低下)或指定代码期望加载的显式地址(这很痛苦),但任何一个都可能自行正常工作.
什么是汇编语法来确定两个数字中的哪一个更大?
什么是较低级别(机器代码)?我们可以走得更低吗?一旦我们达到位水平,会发生什么?它是如何用0和1表示的?
我正在阅读一些关于英特尔操作码汇编指令的资料,但我无法理解它遵循操作码字节是什么意思.例如:"cw","cd","/ 2","cp","/ 3".请给我一个提示是什么意思或在哪里可以找到完整的参考?提前致谢!
E8 cw CALL rel16相对于下一条指令调用near,relative,displacement
E8 cd CALL rel32相对于下一条指令调用near,relative,displacement
FF / 2 CALL r/m16调用r/m16中给出的接近绝对间接地址
FF / 2 CALL r/m32调用r/m32中给出的接近绝对间接地址
9A cd CALL ptr16:16调用操作数中给出的far,absolute,address
9A cp CALL ptr16:32调用操作数中给出的far,absolute,address
FF / 3 CALL m16:16调用m16:16中给出的远,绝对间接地址
FF / 3 CALL m16:32调用m16:32中给出的远,绝对间接地址
例如,如果C#,Java或C++都编译为机器代码,为什么它们不具有同等性能?
我的理解是这些语言是机器代码的抽象,这是他们最终编译的内容.处理器不应该确定性能吗?
我正在读一本书“计算机组织和设计 RISC-V 版”,我遇到了 SB 和 UJ 指令类型的编码。
我上面提到的那些类型具有奇怪的编码立即字段。
SB 类型将立即数字段分成两部分。这是有道理的,因为所有指令编码都必须相似。但我不明白为什么下面的直接字段以这种方式编码。
imm[12, 10:5], imm[4:1, 11]
Run Code Online (Sandbox Code Playgroud)
代替
imm[11:5], imm[4:0]
Run Code Online (Sandbox Code Playgroud)
UJ 类型也有这个奇怪的编码立即字段
imm[20,10:1,11,19:12]
Run Code Online (Sandbox Code Playgroud)
代替
imm[19:0]
Run Code Online (Sandbox Code Playgroud)
谁能解释一下?
有没有任何开源工具或库可用于简单的自定义程序集类语言(用于自动生成的程序)的静态代码分析以及它们能够做什么(检测未使用的代码/寄存器,为代码段提供高级表达式,调用图形)等等.)?该领域确实存在哪些算法?
在从网站上阅读了一些答案并查看了一些资源后,我认为编译器会将高级语言(例如C++)转换为机器代码,因为计算机本身不需要将其转换为汇编,它只会转换它组装以供用户查看代码,并且可以根据需要对代码进行更多控制.
但这可以在我的一个演讲表中找到,所以如果有人能够进一步解释并纠正我,如果我错了,或者下面的截图,我会感激.

machine-code ×10
assembly ×7
c++ ×3
x86 ×3
c ×2
gcc ×2
compare ×1
encoding ×1
executable ×1
intel ×1
linker ×1
llvm ×1
opcode ×1
performance ×1
riscv ×1