1.汇编语言的前世今生

作者: 木子心语 | 来源:发表于2018-04-05 16:41 被阅读264次

我们在学习逆向开发之前,我们要了解一个基本的逆向原理.

  • 一个应用安装到手机,可执行文件本质上是二进制文件.
  • 手机本质上执行的指令是二进制,是由CPU执行的
  • 逆向开发是建立在分析二进制.

接下来,我们从汇编讲起,
说到汇编语言的产生,首先要讲一下机器语言

1.机器语言

1.1什么是机器语言?
  • 机器语言是机器指令的集合。
  • 机器指令展开来讲就是一台机器可以正确执行的命令。
  • 电子计算机的机器指令是一列二进制数字。
  • 计算机转变为一列高低电平,以使计算机的电子器受到驱动,进行运算。
1.2机器语言由来

早期的程序设计均使用机器语言。程序员们将用0,1数字编成的程序代码打在纸带或卡片上,1打孔,0不打孔,再讲程序通过纸带机或卡片机输入计算机,进行运算。

1.3第一个入门程序

身为程序员,每种语言的入门程序,都是welcome to masm。这个是大家都很熟悉第一个程序。
在显示器上输出“welecom to masm”,机器语言怎么写呢?

第一个程序.png

你看到这里有啥想法?
自我感觉挺崩溃的。
上面只是一个非常简单的入门小程序,
写如此小的程序尚且如此,
一个复杂的程序更复杂了。
如果程序中0或1写错了。
估计检查也是挺麻烦的。
只看上面的一段代码,很难识别出来错误的代码。

此时就诞生了另一种语言,方便我们读写。这就汇编语言。

2.汇编语言

2.1什么是汇编语言?
  • 汇编语言的主题是汇编指令
  • 汇编指令和机器指令的差别在于指令的表示方法上。
  • 汇编指令是机器指令便于记忆的书写格式。
2.2汇编指令案例

机器指令1000100111011000表示吧寄存器BX的内容送到AX中。
那我们怎么写汇编指令呢?
我们只需要借助mov指令就可以编写:
mov ax,bx
我们把bx的内容送到ax中,是不是挺简单的。
我们不用在写10这样的机器指令。

2.3.语言的发展
语言发展.png
  • 汇编语言和机器语言是一一对应的。
  • 汇编语言可以通过编译得到汇编机器语言。
  • 机器语言可以通过反编译得到汇编语言。
  • 高级语言可以通过编译得到汇编语言或者机器语言。
  • 汇编语言或者机器语言几乎不可能还原成高级语言。
2.4汇编语言特点
  • 直接访问,控制各种硬件设备。(存储器,CPU)
  • 能够不受编译器的限制,对生产的二级制代码进行完全的控制。
  • 目标代码简短,占用内存少,执行速度快。
  • 汇编语言不具备可移植性。因为每一种CPU都有自己的机器指令集和汇编指令集。
  • 知识点过多,必须对CPU等硬件结构有所了解,不易编写,调试,维护,相比机器语言好了很多。
  • 不区分大小写,比如mov和MOV表达的意思是一样的。
2.5汇编语言用途
  • 编写驱动程序,操作系统。
  • 对性能要求极高的程序或者代码片段,可与高级语言混合使用。
  • 软件安全:病毒分析与防治;加壳、脱壳等。
  • 弄清底层代码的本质。
2.6汇编种类
  • 8086汇编-->>适合入门汇编,8086处理器是16位的CPU。
  • Win32汇编
  • Win64汇编
  • ARM汇编(嵌入式等)

我们iPhone里面用到的是ARM汇编,但是不同的设备也有差异,因为CPU的架构不同

ARM架构
2.7汇编组成
  • 汇编指令:机器码的助记符,有对应的机器码。
  • 伪指令:没有对应的机器码,由编译器执行,没有对应的机器码。
  • 其他符号:如+ 、- 、* 、/等,由编译器识别,没有对应的机器码。
2.8学习汇编
  • 如果想学习汇编,先从8086汇编开始学习,结构简介,经典。
  • 要对CPU等硬件结构有一定的了解。
  • 熟悉软件、程序的执行过程。
  • 最关键的是需要了解CPU和内存。
2.9开始编写我们的一个程序
  • helloworld


    HelloWorld.png
  • 运行结果


    运行结果.jpg

3.汇编语言其他内容

3.1总线
CPU芯片.png
  • 每一个CPU芯片都有许多管脚,这些管脚和总线相连,CPU通过总线跟外部器件进行交互。
  • 总线:一根根导线的集合。
3.2地址、数据、控制总线
总线.png
  • 地址总线:
    1.CPU是通过地址总线来指定存储器单元的。
    2.一个CPU有N根地址线,CPU地址总线的宽度为N。
    3.最多可以寻找2的N次方个内存单元。

地址总线:宽度决定了CPU的寻址能力;8086的地址总线宽度是20,所以寻址能力是1M(2的20次方)。

  • 数据总线:
    1.CPU与内存或其他器件之间的数据传送通过数据总线来进行的。
    2.数据总线的宽度决定了CPU和外界的数据传送速度。

数据总线:它的宽度决定了CPU的单次数据传送量,也就是数据传送速度;8086的数据总线宽度是16,所以单次最大传递2个字节的数据。

8088.png 8086.png

8088的数据总线宽度是8,8086的数据总线是16。
所以8088分两次传送89D8,8086只需要一次传送。

  • 控制总线:
    1.CPU对外部器件的控制是通过控制总线来进行的。
    2.控制总线的宽度决定了CPU对外部器件的控制能力。
3.3我们思考几个问题
  • 1个CPU的寻址能力为8KB,那么他的地址总线的宽度是多少?
    答案是13。-->> 2 的(13) 次方= 1024 * 8,然后13就是地址总线的宽度。
  • 8080、8088,80286,80386的地址总线宽度分别为16根,20根,24根,32根,他们的寻址能力分别为(64)KB,(1)MB,(16)MB,(4)GB。
    怎么计算的呢?
    16根-->>2 的16次方==64KB
    20根-->>2的20次方==1KB * 1024 =1MB
    24根-->>2的24次方==1MB * (2的4次方)=16MB
    32根-->>2的32次方==1GB * (2的2次方) =4GB
  • 8080、8088、8086、80286、80386的数据总线宽度分别为8根、8根、16根、16根,32根。它们一次可以传送的数据为:(1)B,(1)B,(2)B,(2)B,(4)B。
  • 从内存中读取1024字节的数据,8086至少要读取(512)次,8386至少要读取(256)次。
3.4存储器
存储器.png
  • 从读写属性上分为两类:
    1.随机存储器RAM;
    2.只读存储器ROM
    3.随机存储器可读可写,但必须带电存储,关机后存储的内容丢失;
    4.只读存储器只能读取不能写入,关机后其中的内容不丢失。
  • 从功能和连接上分为两三类:
    1.随机存储器:用于存放供CPU使用的绝大部分程序和数据,主随机存储器一般由两个位置上的RAM组成,装在主板上RAM和插在扩展插槽上的RAM。
    2.装有BIOS的ROM
    3.接口上的RAM。
3.5内存
  • 内存地址空间的大小受CPU地址总线宽度的限制。
8086内存地址空间分配.png
  • 图中,内存地址分配:
    0x00000-0x9FFFF:主存储器,可读可写。
    0xA0000-0xBFFFF:向显存中写入数据,这些数据会被显卡输出到显示器,可读可写。
    0xC0000-0xFFFFF:存储各种硬件,系统信息,只读。

4.总结

以上内容是对汇编的产生以及汇编中的知识层进行的介绍。
知识层继续介绍与分析,我们下一节继续进行。
通过这一篇文章,个人感觉汇编也是一种挺有魅力的语言。
很像和它做朋友,所以你必须要深入的了解一下它。

相关文章

网友评论

本文标题:1.汇编语言的前世今生

本文链接:https://www.haomeiwen.com/subject/xcwrhftx.html