我尝试learm LLVM汇编语言。 因为我没有找到任何教程,我的办法是学习编写简单的C函数,并让铛揭示与相应的LLVM代码:
clang -S -emit-llvm simple.c
我现在想学习如何使用指针。 所以,我测试了以下的C函数:
int getVal(int* ptr) { return *ptr; }
这产生以下LLVM:
define i32 @getVal(i32*) #0 {
%2 = alloca i32*, align 8
store i32* %0, i32** %2, align 8
%3 = load i32*, i32** %2, align 8
%4 = load i32, i32* %3, align 4
ret i32 %4
}
我的问题上LLVM代码:
- 什么是0%,即存储操作所指? 这是否指的是函数的参数? 我遇到了1%,而不是0%开始他们的变量的所有其他职能。 什么是这里的区别?
- 下一个变量,我看到的被定义为2%,这意味着1%被跳过。 而且我注意到,这样做(跳跃)导致编译错误。 那么它是如何来到这个代码是有效的?
- 这是什么代码的实际逻辑是什么? 为什么一个存储指令和123-132 **类型的参与? 有没有更简单的实现在LLVM操作“的获得价值”的方式?