一. 反编译一种可能的实现方式

  我们的目的是将多种平台的汇编如x86,ARM,6502反编译为c语言,所以实现时先将多种汇编转化为

特定虚拟机汇编语言,然后只需要将虚拟机汇编语言反编译为c语言。其中多种平台汇编语言到虚拟机汇编语言

也计划由程序通过学习自动完成。

二. 测试的C语句及编译后的x86汇编代码

int a;

int main(void) {
a = 2+3*4;
return 0;
}
 1 lea     rax, a
2 push rax
3 mov rax, 4
4 push rax
5 mov rax, 3
6 pop rdi
7 imul eax, edi
8 push rax
9 mov rax, 2
10 pop rdi
11 add eax, edi
12 pop rdi
13 mov [rdi], eax

三. x86汇编到虚拟机汇编

  我们的目标是将上面的汇编反编译为c语言,在这个过程中先将汇编转化为虚拟机汇编语言。

  这个算法只关注内存操作,因为c语言没有寄存器和栈的概念。

  算法的执行如下,首先汇编的最后一句是内存操作,具体是写内存,算法会首先确定写的内存的具体地址,

通过观察这个地址在rdi寄存器中,修改rdi的为上一条语句"pop rdi",所以会查询哪句将地址压栈,具体会查询到

是第二行"push rax",然后追寻rax的值,追寻到为第一句"lea rax, a",至此具体内存地址确定了。

  下面算法开始追寻eax的值,追寻到第11句"add eax, edi",这句可以理解为eax=eax+edi,所以下面的工作

为确定eax和edi的值,同时生成add虚拟机汇编语句。

  eax的值在第9句"mov rax, 2"确定,此时确定了add虚拟机汇编语句的第一个操作数。edi的值在第10句

"pop rdi",所以查询哪句压栈了,找到第8句"push rax",所以查询谁修改了rax的值,查询到第7句

"imul eax, edi",这句可以理解为eax=eax*edi,所以下面追寻eax和edi的值,此时生成mul虚拟机汇编语句,

同时确定了add虚拟机汇编语句的第二个操作数。

  eax在第5句"mov rax, 3"确定,此时确定mul虚拟机汇编语句的第一个操作数,edi由第6句"pop rdi"确定,

所以查询谁压栈了,查询到第4句"push rax",所以查询rax的值,结果为第3句"mov rax, 4",所以edi值确定为4,

此时确定mul虚拟机汇编语句的第二个操作数。

  最后生成将值写入内存的虚拟机汇编语句。

四. 虚拟机汇编到c语言

  1. 虚拟机汇编语言

  设计的虚拟机是基于栈的,所以上面生成的语句code段部分可能如下。

   |OP_CONSTANT|

   |0|

   |OP_CONSTANT|

   |1|

   |OP_CONSTANT|

   |2|

   |OP_MUL|

   |OP_ADD|

   |OP_SET_GLOBAL|

   |3|

  常量段为

   |2|

   |3|

   |4|

   |a|

  上面的语句执行过程为,OP_CONSTANT会从常量段中取出对应下标的数字压入栈中,

OP_CONSTANT 0将2压入栈中,OP_CONSTANT 1将3压入栈中,OP_CONSTANT 2将4压入栈中,

OP_MUL将栈中最顶层的2个数弹出并计算他们的乘积,将结果压回栈中,这样栈中就是2和12,

OP_ADD将栈中最顶层的2个数弹出并计算他们的和,将结果压回栈中,这样栈中就是14。最后将栈顶的

14写回到变量a中。

  

  2. 反编译为c语言

  遇到OP_MUL,分析最近的两个压栈操作,这里是两个OP_CONSTANT,于是生成语句3*4,遇到指令

OP_ADD,分析最近的两个压栈操作,这里是OP_MUL和OP_CONSTANT,于是生成语句2+3*4。最后

OP_SET_GLOBAL寻找最近操作栈顶的操作,发现是OP_ADD,于是生成语句a = 2+3*4,至此x86汇编语言被

反编译为c语言。

  

  

x86汇编反编译到c语言之——(1)表达式求值及赋值语句的更多相关文章

  1. x86汇编反编译到c语言之——(2)if语句

    一. 测试的C语句及编译后的x86汇编代码 int a; int b; int main(void) { int c; if (c) a = 4; else b = 5; return 0; } 1 ...

  2. C/C++ 语言中的表达式求值

    在此,首先向裘老师致敬! 裘宗燕:C/C++ 语言中的表达式求值 经常可以在一些讨论组里看到下面的提问:“谁知道下面C语句给n赋什么值?” m = 1; n = m+++m++; 最近有位不相识的朋友 ...

  3. C/C++ 语言中的表达式求值(原文作者:裘宗燕)

    经常可以在一些讨论组里看到下面的提问:“谁知道下面C语句给n赋什么值?”m = 1; n = m+++m++;最近有位不相识的朋友发email给我,问为什么在某个C++系统里,下面表达式打印出两个4, ...

  4. C语言 写的 表达式求值。

    有不对的地方还望指出来,让我改正.谢谢.存一个代码 #include<stdio.h> #include<stdlib.h> #include<string.h> ...

  5. C语言之四则运算表达式求值(链栈)—支持浮点型数据,负数, 整型数据运算

     运算符间的优先级关系: 链栈结构体定义: 数据域使用字符串长度为20的字符数组(故需要注意判断读取的字符串是运算符还是数值) 可支持浮点型数据,负数, 整型数据的运算 float EvaluateE ...

  6. 利用栈实现算术表达式求值(Java语言描述)

    利用栈实现算术表达式求值(Java语言描述) 算术表达式求值是栈的典型应用,自己写栈,实现Java栈算术表达式求值,涉及栈,编译原理方面的知识.声明:部分代码参考自茫茫大海的专栏. 链栈的实现: pa ...

  7. 数据结构算法C语言实现(八)--- 3.2栈的应用举例:迷宫求解与表达式求值

    一.简介 迷宫求解:类似图的DFS.具体的算法思路可以参考书上的50.51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意.大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚, ...

  8. 数据结构课程设计四则运算表达式求值(C语言版)

    本系统为四则运算表达式求值系统,用于带小括号的一定范围内正负数的四则运算标准(中缀)表达式的求值.注意事项:    1.请保证输入的四则表达式的合法性.输入的中缀表达式中只能含有英文符号"+ ...

  9. 表达式求值--数据结构C语言算法实现

    这篇博客介绍的表达式求值是用C语言实现的,只使用了c++里面的引用. 数据结构课本上的一个例题,但是看起来很简单,实现却遇到了很多问题. 这个题需要构建两个栈,一个用来存储运算符OPTR, 一个用来存 ...

随机推荐

  1. 【集成学习】:Stacking原理以及Python代码实现

    Stacking集成学习在各类机器学习竞赛当中得到了广泛的应用,尤其是在结构化的机器学习竞赛当中表现非常好.今天我们就来介绍下stacking这个在机器学习模型融合当中的大杀器的原理.并在博文的后面附 ...

  2. NOIP模拟80

    学考+OJ改名祭 T1 邻面合并 解题思路 状压 DP ...(于是贪心竟然有 60pts 的高分?? code) 状态设计的就非常妙了,如果状态是 1 就表示是一个分割点也就是一个矩形的右边界. 那 ...

  3. 初学python-day3 元组

    day2 列表已更新!

  4. 项目优化之v-if

    前言: 在vue项目中,由于功能比较多,需要各种条件控制某个功能.某个标签.表格中的某一行是否显示等,需要使用大量的v-if来判断条件. 例如: <div v-if="isShow(a ...

  5. JDK中的SPI机制

    前言 最近学习类加载的过程中,了解到JDK提供给我们的一个可扩展的接口:java.util.ServiceLoader, 之前自己不了解这个机制,甚是惭愧... 什么是SPI SPI全称为(Servi ...

  6. 运维常用python库&模块

    sutil:是一个跨平台库(https://github.com/giampaolo/psutil)能够实现获取系统运行的进程和系统利用率(内存,CPU,磁盘,网络等),主要用于系统监控,分析和系统资 ...

  7. python +spatialite + window 解决方案(https://www.jianshu.com/p/5bc7d8b7b429)

    运行环境在windows 10 64bit.先将python安装完成.然后,到 spatilite官网 找到MS(即Microsoft)版本,下载64位的mod_spatialite,将其先解压到目标 ...

  8. Linux零基础之shell基础编程入门

    从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁.用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操 ...

  9. 基于屏幕空间的实时全局光照(Real-time Global Illumination Based On Screen Space)

    目录 Reflective Shadow Maps(RSM) RSM 的重要性采样 RSM 的应用与缺陷 Screen Space Ambient Occulsion(SSAO) SSAO Blur ...

  10. 数值的整数次方 牛客网 剑指Offer

    数值的整数次方 牛客网 剑指Offer 题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方 class Solution: #run ...