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