【8086汇编-Day1】预备知识
菜鸟的8086汇编入门之旅,偶有错处恭请大佬们指正。
Ⅰ· 闲说一下
我为什么学汇编?相对于晦涩难懂的01010101011010机器语言(高低电平变化驱动机器做出不同反应),汇编语言用更便于记忆和使用(更接近自然语言),而相较于高级语言,汇编的执行效率更
高,这些是书上讲的。于我而言,是为了反汇编和逆向编程做准备,当走进汇编的世界,能把别人的软件“拆的更碎”。能从更深的角度去解读别人的编程思路,无论是对自己的语言、编程学习,抑
或是做好安全编程,研究CTF的reverse方向都益处良多。
Ⅱ · 基础知识
①冯诺依曼体系结构
1946年美籍匈牙利科学家冯·诺依曼提出存储程序原理,把程序本身当作数据来对待,程序和该程序处理的数据用同样的方式存储,并确定了存储程序计算机的五大组成部分(运算器、控制器、存
储器、输入设备和输出设备)和基本工作方法(把要执行的程序和处理的数据首先存入主存储器(内存),计算机执行程序时,将自动地并按顺序从主存储器中取出指令一条一条地执行)。
![](https://gss3.bdstatic.com/7Po3dSag_xI4khGkpoWK1HF6hhy/baike/c0%3Dbaike80%2C5%2C5%2C80%2C26/sign=5b8ec5628db1cb132a643441bc3d3d2b/a8773912b31bb051973f1da5367adab44aede020.jpg)
②PC机的心脏、血液、大脑 对于PC机而言,CPU(控制器与运算器)就像是大脑,处理信息并告诉机器各“肢体”如何协调工作,而存储器(内存/磁盘)则就是存储提供信息(指令及数据)的源头,就像PC机的心脏,供给大脑赖
以活跃及工作的血液(指令/程序)。
存储器以8bit'位'(即1byte'字节')为一个存储单元划分,正常微机中常用计量单位换算如下:1024B=1KB、1024KB=1MB、1024MB=1G、1024G=T,而硬盘生产厂商通常采用"10^3=1"方式
换算(所以电脑上查看到的实际容量偏小)。
正如冯诺依曼体系所言,在存储器中,指令和数据均以二进制形式无差别地存储,而两者的区分则取决于CPU中两个特殊的寄存器:存放代码段段地址的CS和指向下一条指令地址(偏移量)的IP(详
细内容在寄存器部分补充)。
那么机器的大脑如何向心脏汲取这些血液进行工作呢?自然也是需要一条条的“血管”来传输,在微机中就指的是“地址线、数据线、控制线”,这些导线用不同的电信号来传输不同的信息。
如图,CPU先要告诉内存,我要对你哪块儿地方动手(用地址总线传地址),然后专门有个路子(控制总线)来告诉内存“我要从这里拿东西还是往这里放东西”(内存读写),最后就是在这数据总线上
存/取数据了。
那么这些线究竟是如何实现这些的呢?我们知道机器里只认高低电平(1/0),那么一条总线有具体几根导线组成,这根导线就能传递2的几次方种状态(即数据)。我们把这个称作是这个总线的能力
那么对应地址总线就是他的寻址能力,对应数据总线,就是他的一次数据传送量,对应控制总线就叫做控制能力。
③内存地址空间
内存地址空间是对CPU而言的一个概念,并非我们常说的内存条容量,CPU的地址总线有多强,他的内存地址空间就多大。比如8086处理器有20跟地址线,则他的寻址能力则为2^20bit(128KB),即该
CPU能找到131072个存储单元,那么这就是8086的内存地址空间即128KB大小。
而实际一台PC机不可能只有一个主存储设备(内存),他的CPU还会连着各种各样的器件,这些器件上也有存储的地方,那么CPU就会讲所有的这些物理上分隔的存储器共同
编制成“连续”的逻辑存储器,每个物理存储器在这个逻辑存储器中都有他的映射。然后CPU会依据不同的用途将内存地址空间分成不同的块。下图是8086PC机内地址空间分
配。
![](https://img2018.cnblogs.com/blog/1366464/201809/1366464-20180926004524573-804189174.png)
Ⅲ·总结
以上内容琐碎切显冗杂,但理解好这些基础知识,对汇编语言的继续学习有一定意义,帮助我们深入的理解及其工作的重要基本原理。