程序的实际构成,不可不知的反汇编相关知识

我们都知道编程语言有好几代,那他们都是什么

还是那句话,CPU能运行的只有本地代码(机器语言)程序,其内容是数值的罗列。

最低级的语言,一般有0和1组成,人很难讲指令和数据区分开也称机器语言,字节码,二进制文件

汇编语言

在本地代码程序中,内容只是数值的罗列,人类无法识别。
想法:在各本地代码中,附上表示其功能的英文缩写。
比如:执行加法运算的本地代码中,加上add(addition的缩写);比较运算的本地代码中,加上cmp(compare的缩写)。可以有助于理解。
这些缩写称为助记符,使用这些助记符的编程语言就是汇编语言汇编文件后缀.asm.

汇编语言和机器语言是一一对应的。
汇编语言–>机器语言:汇编。由汇编器完成。
机器语言–>汇编语言:反汇编。由反汇编程序完成。

图片 1

C语言等高级编程语言和机器语言不是一一对应的,因而反编译比反汇编困难。

汇编语言,他脱离了机器语言的0和1,使用短小且容易记忆的助记符对应相应的操作码。汇编器是将汇编转为机器码的工具

通过编译器,将其他编程语言代码转变为汇编代码

除了将本地代码通过反汇编转换得到汇编语言代码,大部分的C语言编译器,都可以将C语言代码转换为汇编代码。
程序栗子:
#include <stdio.h>
void main(){
//求和
int addNum(int a, int b){
return a+b;
}
//调用
void myFunc(){
int c;
c = addNum(123,456);
}
}
仅编译而不链接,生成.asm汇编文件。

图片 2

图片 3

图片 4

引入了关键字和结构来描述事物,使得他使用起来更加接近自然语言。他们通常不依赖任何平台,如:C,Java

汇编语言的源代码里有什么?

汇编语言的源代码=转换成机器语言的指令(操作码)+针对汇编器的伪指令

伪指令:将程序构造和汇编方法指示给汇编器,本身不会转换为本地代码。

图片 5

图片 6

图片 7

图片 8

图片 9

汇编语言的真正语法:操作码+操作数

操作码:指令动作。操作数:指令对象。

图片 10

CPU中的寄存器的名称会通过汇编语言的源代码指定给操作数。

图片 11

传统软件开发过程中,一般是编译器-汇编器-链接器最后输出可执行程序。所以反汇编就是输入二进制文件或可执行文件输出汇编代码的过程。反编译器通常是输出高级语言

汇编语言的几个主要操作码

机器语言没有变量或函数名,变量类型信息只能通过用途来确定,如:看到一个32位的数据被传送到寄存器,需要很好地分析一番才能得出这是一个整数,还是浮点数或指针

mov指令

图片 12

就是源程序可以通过多重凡是转为汇编语言,而机器语言也可通过多重方式转为源程序

栈操作:push() 和 pop()

push指令和pop指令都只有一个操作数,表示push或pop的是什么。

图片 13

用专门反编译c代码的编译器来反编译delphi生成的代码,可能会出现非常乖的语法。同样用对windows
api一无所知的反编译器反编译windows二进制,也会出现上述结果

汇编语言函数调用

图片 14

图片 15

图片 16

图片 17

图片 18

发表评论

电子邮件地址不会被公开。 必填项已用*标注