标签: machine-code

如何使用llvm生成机器代码

我目前正在使用llvm编写一个编译器项目.我已经按照各种教程进行操作,以便我有一个解析器来创建语法树,然后使用提供的IRBuilder将树转换为llvm模块.

我的目标是创建一个可执行文件,我很困惑,接下来该做什么.我发现的所有教程都创建了llvm模块并使用Module.dump()打印出程序集.另外,我能找到的唯一文档是llvm开发人员,而不是项目的最终用户.

如果我想生成机器代码,接下来的步骤是什么?llvm-mc项目看起来可能会做我想要的,但我找不到任何类型的文档.

也许我期待自己会做一些事情.我的期望是我可以构建一个模块,然后会有一个我可以使用模块调用的API,并且将生成一个目标三元组和一个目标文件.我找到了关于生成JIT的文档和示例,我对此并不感兴趣.我正在寻找如何生成编译的二进制文件.

我正在研究OS X,如果这有任何影响.

c++ llvm machine-code

22
推荐指数
3
解决办法
1万
查看次数

AMD64 - nopw汇编指令?

在这个编译器输出中,我试图理解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长度的函数.

c x86 assembly gcc machine-code

20
推荐指数
1
解决办法
1万
查看次数

如何让gcc只生成可以直接加载到内存并执行的机器代码?

我想生成一个可以加载到内存中的文件(例如with mmap),然后跳转到该内存的开头运行代码.

理想情况下,我希望选择使代码可重定位(可能效率低下)或指定代码期望加载的显式地址(这很痛苦),但任何一个都可能自行正常工作.

c linker executable gcc machine-code

17
推荐指数
2
解决办法
6896
查看次数

汇编来比较两个数字

什么是汇编语法来确定两个数字中的哪一个更大?

什么是较低级别(机器代码)?我们可以走得更低吗?一旦我们达到位水平,会发生什么?它是如何用0和1表示的?

x86 assembly compare machine-code

15
推荐指数
4
解决办法
11万
查看次数

如何阅读英特尔操作码表示法

我正在阅读一些关于英特尔操作码汇编指令的资料,但我无法理解它遵循操作码字节是什么意思.例如:"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中给出的远,绝对间接地址

x86 assembly intel machine-code opcode

15
推荐指数
3
解决办法
4909
查看次数

大多数用于动态代码生成的可移植库

我正在寻找最便携的汇编程序库,如asmjitjitasm.

当我说'最便携'时,我的意思是,它对大量架构的支持最多.语言并不重要,但C++将是最好的解决方案,尤其是与GCC结合使用时.

对我来说重要的架构是x86/64,PowerPC和ARM.

c++ assembly code-generation cpu-architecture machine-code

13
推荐指数
3
解决办法
6557
查看次数

如果编译语言最终成为机器代码,为什么它们不能同等地执行?

例如,如果C#,Java或C++都编译为机器代码,为什么它们不具有同等性能?

我的理解是这些语言是机器代码的抽象,这是他们最终编译的内容.处理器不应该确定性能吗?

performance programming-languages machine-code

12
推荐指数
3
解决办法
561
查看次数

为什么 RISC-V SB 和 UJ 指令类型以这种方式编码?

我正在读一本书“计算机组织和设计 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)

谁能解释一下?

assembly encoding instruction-set machine-code riscv

11
推荐指数
2
解决办法
2964
查看次数

汇编语言的静态代码分析

有没有任何开源工具或库可用于简单的自定义程序集类语言(用于自动生成的程序)的静态代码分析以及它们能够做什么(检测未使用的代码/寄存器,为代码段提供高级表达式,调用图形)等等.)?该领域确实存在哪些算法?

assembly code-analysis static-analysis machine-code

10
推荐指数
1
解决办法
4085
查看次数

将高级语言编译为机器代码

在从网站上阅读了一些答案并查看了一些资源后,我认为编译器会将高级语言(例如C++)转换为机器代码,因为计算机本身不需要将其转换为汇编,它只会转换它组装以供用户查看代码,并且可以根据需要对代码进行更多控制.

但这可以在我的一个演讲表中找到,所以如果有人能够进一步解释并纠正我,如果我错了,或者下面的截图,我会感激.

滑动

c++ compiler-construction assembly machine-code

10
推荐指数
2
解决办法
4462
查看次数