【8086汇编-Day1】预备知识
菜鸟的8086汇编入门之旅,偶有错处恭请大佬们指正。
Ⅰ· 闲说一下
我为什么学汇编?相对于晦涩难懂的01010101011010机器语言(高低电平变化驱动机器做出不同反应),汇编语言用更便于记忆和使用(更接近自然语言),而相较于高级语言,汇编的执行效率更
高,这些是书上讲的。于我而言,是为了反汇编和逆向编程做准备,当走进汇编的世界,能把别人的软件“拆的更碎”。能从更深的角度去解读别人的编程思路,无论是对自己的语言、编程学习,抑
或是做好安全编程,研究CTF的reverse方向都益处良多。
Ⅱ · 基础知识
①冯诺依曼体系结构
1946年美籍匈牙利科学家冯·诺依曼提出存储程序原理,把程序本身当作数据来对待,程序和该程序处理的数据用同样的方式存储,并确定了存储程序计算机的五大组成部分(运算器、控制器、存
储器、输入设备和输出设备)和基本工作方法(把要执行的程序和处理的数据首先存入主存储器(内存),计算机执行程序时,将自动地并按顺序从主存储器中取出指令一条一条地执行)。
②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机内地址空间分
配。
Ⅲ·总结
以上内容琐碎切显冗杂,但理解好这些基础知识,对汇编语言的继续学习有一定意义,帮助我们深入的理解及其工作的重要基本原理。
【8086汇编-Day1】预备知识的更多相关文章
- C++ day01 预备知识、C++综述、教材、推荐阅读。
C++ day01: 1.预备知识? 1)什么是编程 编程,即编订程序. 程序 = 数据 + 算法(蛋糕 = 糖.鸡蛋.奶油 + 打鸡蛋.加糖.烤) 2)编程语言 最初的编程是用二进制代码(即“机器码 ...
- 8086汇编语言学习(二) 8086汇编开发环境搭建和Debug模式介绍
1. 8086汇编开发环境搭建 在上篇博客中简单的介绍了8086汇编语言.工欲善其事,必先利其器,在8086汇编语言正式开始学习之前,先介绍一下如何搭建8086汇编的开发环境. 汇编语言设计之初是用于 ...
- 【协作式原创】查漏补缺之Golang中mutex源码实现(预备知识)
预备知识 CAS机制 1. 是什么 参考附录3 CAS 是项乐观锁技术,当多个线程尝试使用 CAS 同时更新同一个变量时,只有其中一个线程能更新变量的值,而其它线程都失败,失败的线程并不会被挂起,而是 ...
- 驱动开发学习笔记. 0.06 嵌入式linux视频开发之预备知识
驱动开发读书笔记. 0.06 嵌入式linux视频开发之预备知识 由于毕业设计选择了嵌入式linux视频开发相关的项目,于是找了相关的资料,下面是一下预备知识 UVC : UVC,全称为:USB v ...
- 受限玻尔兹曼机(RBM)学习笔记(一)预备知识
去年 6 月份写的博文<Yusuke Sugomori 的 C 语言 Deep Learning 程序解读>是囫囵吞枣地读完一个关于 DBN 算法的开源代码后的笔记,当时对其中涉及的算法原 ...
- 学习Identity Server 4的预备知识
我要使用asp.net core 2.0 web api 搭建一个基础框架并立即应用于一个实际的项目中去. 这里需要使用identity server 4 做单点登陆. 下面就简单学习一下相关的预备知 ...
- JAVA面向对象-----面向对象(基础预备知识汇总)
终于整理好了面向对象基础预备知识,但是有点多,所以你们懂的,贴图,较长的代码我还是会排版出来的,我不想把时间浪费在排版上在word里排版一次已经很浪费时间了,所以请谅解. public class C ...
- 用ASP.NET Core 2.0 建立规范的 REST API -- 预备知识 (2) + 准备项目
上一部分预备知识在这 http://www.cnblogs.com/cgzl/p/9010978.html 如果您对ASP.NET Core很了解的话,可以不看本文, 本文基本都是官方文档的内容. A ...
- ASP.NET Core的实时库: SignalR -- 预备知识
大纲 本系列会分为2-3篇文章. 第一篇介绍SignalR的预备知识和原理 然后会介绍SignalR和如何在ASP.NET Core里使用SignalR. 本文的目录如下: 实时Web简述 Long ...
随机推荐
- 25个最佳的SSH命令
参考文献地址(SSH原理与运用(一):远程登录): http://www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html 参考文献地址(SSH原理与 ...
- [日常] NOIp 2018 滚粗记
考试前预感到自己会滚大粗 然后发现确实滚了个大粗 ==== €€£ WARNING ==== 因为是后补的所以更新速度比较慢 最后决定把半成品扔出来 预计本周末放假会更完吧 2019.2.25 upd ...
- ubuntu 14.04 配置 java 环境
下载java包 (这里以java8为例) java包的下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloa ...
- JavaScript设计模式之设计原则
何为设计 即按照哪一种思路或者标准来实现功能,功能相同,可以有不同的设计方案来实现 伴随着需求的增加,设计的作用就会体现出来,一般的APP每天都在变化,更新很快,需求不断在增加,如果设计的不好,后面很 ...
- CCControlExtension/CCControl
#ifndef __CCCONTROL_H__ #define __CCCONTROL_H__ #include "CCInvocation.h" #include "C ...
- win10里如何在中文输入法里添加美式键盘
在控制面板打开“时钟.语言和区域”设置界面,选中“语言”设置 “语言”设置里点击“添加语言” 在添加语言设置里选择“英语”,并点击“打开”按钮,在“区域变量”设置页面里选择“英语(美国)” ,并点击 ...
- MyBatis(2)-全局配置文件
本文的代码是在MyBatis(1)-简单入门基础之上进行学习的,如有不懂请先看此博文MyBatis(1)-简单入门! 1)配置文件的安装 --->在联网的情况下,点击去下载http://myba ...
- Dubbo实践(十)代理
Invoker调用 代理有几种方式:普通代理.JDK.Javassist库动态代理.Javassist库动态字节码代理. 生成代理的目的是你调用invoker的相关函数后,就等同于是调用DubboIn ...
- JNDI数据源(在Tomcat下配置JNDI多数据源实例)
一,添加数据库驱动包加入classpath. 这里我用到了oracle和mysql.所以由两个jar包:ojdbc14.jar和mysql-connector-java-5.1.13-bin.jar. ...
- Xcode 创建 支持IOS4.3以上版本的应用的方法
如果是Xcode 5的话步骤为 点击项目名称->Build Settings->搜索 Architectures 这个里面的原始的值是Standard architectures(armv ...