汇编逆向分析职业经理

汇编语言:基础

2017-07-27  本文已影响96人  华落

一篇前言

这是一系列的汇编语言学习的读书笔记,以及一些自己的理解系列文章。我想我会在循序渐进的学习中,写下对汇编的点点滴滴,一方面是给自己立一个短期的小目标,另一方面,如果您有缘看到了这一系列的文章,希望对您有所帮助。

机器语言和汇编语言

虽然我们在写程序的时候使用的是诸如C,C++等高级语言,但最终会通过编译器转换成二进制的机器语言,机器语言实际上是一堆二进制指令的集合,计算机会将它转换成高低电平驱动硬件工作,实际上计算机非常的笨蛋,只能认识高低电平,所以,我们用二进制来代替高低电平,例如我们要计算s = 768 + 12288 - 1280,机器码如下:

101110000000000000000011
000001010000000000110000
001011010000000000000101

这种机器码非常难以书写,修改和记忆,早起的程序员很快就发现了这些问题,于是他们就发明了汇编语言。
  汇编语言实际上是机器语言的另一种书写格式。
比如:机器指令:1000100111011000表示把寄存器 bx的内容放到ax中去,而对应的汇编指令可以写成mov ax,bx。这样的写法更容易记忆和理解。
寄存器:简单的理解就是一种cpu内部用来存放数据的东西。
  可是计算机只认识01这样的机器代码,那怎么让计算机认识更贴近人类语言的汇编语言呢?这时候就需要一个翻译的中间程序,把汇编语言翻译成01这样的机器指令,我们把它叫做编译器。下图展示了这个翻译过程,实际上我们今天使用的java,c等高级语言也会先翻译成汇编,再由汇编翻译成机器指令。



那么,汇编语言由哪些东西组成的呢?

存储器

  cpu是计算机的核心部件,cpu要想工作,就必须要给它指令和数据,指令和数据在存储器中存放,也就是我们平时所说的内存。这里要注意,磁盘或者硬盘不同于内存,我们平时的程序是放在硬盘上的,如果想要运行程序,必须将程序的指令和数据加载到内存中。

指令和数据

  指令和数据在内存和磁盘上是没有区别的,都是一堆01的二进制数据。
比如:1000100111011000
作为数据是:89D8H (H代表16进制数据)
作为指令是:mov ax,bx

存储单元

存储器(这里所说的存储器,就是我们所说的内存,但不单指内存条,还有显存等硬件的内存)被划分为N个,就是很多个存储单元,你可以把它想象成一个个的小格子,每一个存储单元的大小是1个字节,也就是可以存放8个0101。它们从0开始编号,拥有自己的地址。
例如,下图是一个拥有128个存储单元的存储器的内存单元布局,0~127


计算机对存储器的读写

前面,我们讲cpu要想工作,必须有存储器提供指令和数据,我们知道存储器被划分为一个个的存储单元,数据在每一个存储单元中,cpu要想对存储器的内容进行访问至少要满足下面3个要求:
1、 存储单元的地址:cpu要知道内存单元的地址(也就是要知道我即将读取哪一个内存单元中的内容)。
2、 控制器信息:cpu是要读数据还是写数据
3、 数据信息:我们要写入或者读取的数据信息。

那么cpu又是通过什么将地址,控制信息,数据信息传递给存储器的呢?

我们知道cpu是通过高低电平驱动计算机硬件进行工作的,而传递这些电信号,需要导线,在计算机中连接cpu和其他各种芯片的导线,我们称为数据总线。

地址总线

cpu是通过地址总线来指定要操作的内存单元,那么地址总线上一次能传送的多少个不同的信息,多少个0101,决定了cpu能够对多少个内存单元进行寻址。

数据总线

cpu和存储器之间传输数据的总线,数据总线的的宽度,决定了一次能够传输数据的大小,8根数据总线一次可传输8bit(位),即一个字节大小,16根数据总线一次可传输16bit的数据,即2个字节大小。


8位数据总线上一次传输的信息.png
     16数据总线上一次传输的信息.png
由此可见:数据总线的宽度决定了cpu与外界传输数据的速度。

控制总线

cpu对外部芯片的控制,是通过控制总线来完成的,这里控制总线只是个总称,控制总线是很多根不同控制线的集合。多少根控制总线,就决定了cpu能对多少个外部芯片的控制。

小结一下

以上呢都是一些枯燥的内容,但对于理解汇编又尤为重要的基础,我们稍作总结:

上一篇 下一篇

猜你喜欢

热点阅读