Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 将armv7m指令转换为LLVM IR 我开发了一个C++中的升降机,它将ARMV7m指令提升到LLVM IR。_Assembly_Llvm_Reverse Engineering_Armv7_Lifting - Fatal编程技术网

Assembly 将armv7m指令转换为LLVM IR 我开发了一个C++中的升降机,它将ARMV7m指令提升到LLVM IR。

Assembly 将armv7m指令转换为LLVM IR 我开发了一个C++中的升降机,它将ARMV7m指令提升到LLVM IR。,assembly,llvm,reverse-engineering,armv7,lifting,Assembly,Llvm,Reverse Engineering,Armv7,Lifting,现在我正处于翻译阶段,我只需输入一条arm指令并将其转换为等效的SSA LLVM IR指令 我的体系结构只是为汇编代码中的每个函数创建一个llvm函数,并为函数中的每个基本块创建一个llvm基本块,对于基本块中的每个汇编指令,我使用生成器为该指令构建等效的llvm IR指令(将该指令的基本块的llvm基本块传递给IRBuilder时)…我的ADD汇编指令代码示例 //Translates an ADD assembly instruction object into the equivalent

现在我正处于翻译阶段,我只需输入一条arm指令并将其转换为等效的SSA LLVM IR指令

我的体系结构只是为汇编代码中的每个函数创建一个llvm函数,并为函数中的每个基本块创建一个llvm基本块,对于基本块中的每个汇编指令,我使用生成器为该指令构建等效的llvm IR指令(将该指令的基本块的llvm基本块传递给IRBuilder时)…我的ADD汇编指令代码示例

//Translates an ADD assembly instruction object into the equivalent SSA llvm IR instructions.  
llvm::Instruction* ADD(Instr* instruction, bool update_condition_flags = false) {

    IRBuilder<> builder(instruction->basic_block->get_llvm_basic_block());

    std::vector<Reg*> registers = instruction->get_registers();

    std::vector<Immediate*> immediates = instruction->get_immediates();

    if (instruction->get_immediates().empty()) {

            std::string register1 = registers[1]->get_register_name();

            Value* register1_val = registers[1]->get_register_value();

            llvm::Value* immediate = immediates[0]->get_immediate_value_long();

            std::string output_register = registers[0]->get_register_name();

            llvm::Instruction* x = builder.CreateAlloca(Type::getInt32Ty(TheContext), nullptr);

            instruction->insert_llvm_instructions(x);

            llvm::Instruction* s = builder.CreateStore(register1_val, x, /*isVolatile=*/false);

            instruction->insert_llvm_instructions(s);

            llvm::Instruction* LHS = builder.CreateLoad(x, register1);

            instruction->insert_llvm_instructions(LHS);

            llvm::Instruction* add_ll = BinaryOperator::Create(Instruction::Add,
                LHS, immediate, output_register);

            instruction->insert_llvm_instructions(add_ll);

            return add_ll;

LLVM IR使用SSA,即每个符号仅指一个值。
不可能添加r3,r3,#1,因为r3指两个值(结果和输入)


我认为最常见的解决方案是添加一个由函数内偏移量确定的后缀。如果该add是第16条指令,并且它使用的r3来自第12条指令,那么可能
%r3.16=add i32%r3.12,1
LLVM IR使用SSA,即每个符号只引用一个值。
添加r3,r3,#1
是不可能的,because r3表示两个值(结果和输入)


我认为最常见的解决方案是添加一个由函数内的偏移量确定的后缀。如果add是第16条指令,而它使用的r3来自第12条指令,那么可能
%r3.16=add i32%r3.12,1

我猜这是因为LLVM使用SSA(),这些索引更像是寄存器版本号,不可移动。相关项目:我猜因为LLVM使用SSA(),所以这些索引更像是寄存器版本号,不可移动。相关项目:
 ldr r3, [fp, #-8] 

 add r3, r3, #1 

 str r3, [fp, #-8]