x86汇编反编译到c语言之——(1)表达式求值及赋值语句
一. 反编译一种可能的实现方式
我们的目的是将多种平台的汇编如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)表达式求值及赋值语句的更多相关文章
- 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 ...
- C/C++ 语言中的表达式求值
在此,首先向裘老师致敬! 裘宗燕:C/C++ 语言中的表达式求值 经常可以在一些讨论组里看到下面的提问:“谁知道下面C语句给n赋什么值?” m = 1; n = m+++m++; 最近有位不相识的朋友 ...
- C/C++ 语言中的表达式求值(原文作者:裘宗燕)
经常可以在一些讨论组里看到下面的提问:“谁知道下面C语句给n赋什么值?”m = 1; n = m+++m++;最近有位不相识的朋友发email给我,问为什么在某个C++系统里,下面表达式打印出两个4, ...
- C语言 写的 表达式求值。
有不对的地方还望指出来,让我改正.谢谢.存一个代码 #include<stdio.h> #include<stdlib.h> #include<string.h> ...
- C语言之四则运算表达式求值(链栈)—支持浮点型数据,负数, 整型数据运算
运算符间的优先级关系: 链栈结构体定义: 数据域使用字符串长度为20的字符数组(故需要注意判断读取的字符串是运算符还是数值) 可支持浮点型数据,负数, 整型数据的运算 float EvaluateE ...
- 利用栈实现算术表达式求值(Java语言描述)
利用栈实现算术表达式求值(Java语言描述) 算术表达式求值是栈的典型应用,自己写栈,实现Java栈算术表达式求值,涉及栈,编译原理方面的知识.声明:部分代码参考自茫茫大海的专栏. 链栈的实现: pa ...
- 数据结构算法C语言实现(八)--- 3.2栈的应用举例:迷宫求解与表达式求值
一.简介 迷宫求解:类似图的DFS.具体的算法思路可以参考书上的50.51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意.大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚, ...
- 数据结构课程设计四则运算表达式求值(C语言版)
本系统为四则运算表达式求值系统,用于带小括号的一定范围内正负数的四则运算标准(中缀)表达式的求值.注意事项: 1.请保证输入的四则表达式的合法性.输入的中缀表达式中只能含有英文符号"+ ...
- 表达式求值--数据结构C语言算法实现
这篇博客介绍的表达式求值是用C语言实现的,只使用了c++里面的引用. 数据结构课本上的一个例题,但是看起来很简单,实现却遇到了很多问题. 这个题需要构建两个栈,一个用来存储运算符OPTR, 一个用来存 ...
随机推荐
- PAT (Basic Level) Practice (中文)1025 反转链表 (25分)
1025 反转链表 (25分) 给定一个常数 K 以及一个单链表 L,请编写程序将 L 中每 K 个结点反转.例如:给定 L 为 1→2→3→4→5→6,K 为 3,则输出应该为 3→2→1→6→5→ ...
- JS最简单的定时累加计数器
js代码: 1 var timer , k = 0; 2 function star() { 3 k += 1; 4 document.getElementById("num"). ...
- 电脑日常使用bug记录
1.由于电脑太卡了,于是决定关一点服务,一不小心,电脑无线无法使用了.启动无线服务时提示"windows无法启动wlan autoconfig服务错误1068依赖服务" 启动 Ex ...
- 深入浅出Java内存模型
面试官:我记得上一次已经问过了为什么要有Java内存模型 面试官:我记得你的最终答案是:Java为了屏蔽硬件和操作系统访问内存的各种差异,提出了「Java内存模型」的规范,保证了Java程序在各种平台 ...
- [敏捷软工团队博客]Beta阶段发布声明
项目 内容 2020春季计算机学院软件工程(罗杰 任健) 博客园班级博客 作业要求 Beta阶段发布声明 我们在这个课程的目标是 在团队合作中锻炼自己 这个作业在哪个具体方面帮助我们实现目标 对Bet ...
- BUAA 软工 | 从计算机技术中探索艺术之路
项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 第一次作业-热身! 我在这个课程的目标是 掌握软件开发方法学和工程学知识 这个作业在哪个具体方面帮 ...
- RocketMQ源码详解 | Producer篇 · 其一:Start,然后 Send 一条消息
概述 DefaultMQProducer producer = new DefaultMQProducer("please_rename_unique_group_name"); ...
- str数组
- Machine learning(2-Linear regression with one variable )
1.Model representation Our Training Set [训练集]: We will start with this ''Housing price prediction'' ...
- hdu 5057 Argestes and Sequence (数状数组+离线处理)
题意: 给N个数.a[1]....a[N]. M种操作: S X Y:令a[X]=Y Q L R D P:查询a[L]...a[R]中满足第D位上数字为P的数的个数 数据范围: 1<=T< ...