02(课程安排,二极管,门,汇编,8086,时序,I_O桥,总线,debug,标志寄存器)

课程安排

十六位汇编在工作中是不会遇到了

至少也是32位汇编,但是这保留十六位的课程,把十六位去掉的话,

去十六位汇编也就是去这两节课,剩下的东西都需要并入到32位汇编

所以你会发现十六位汇编跟32位汇编从指令这些东西,还有后面的语法完全都是通用的,十六位学了到32位不用在学了

模式

十六位汇编跟32位汇编,等到以后学内核的时候有两个新名称,十六位汇编叫做实模式,32位汇编我们叫做保护模式

什么意思呢?

相当于16位汇编他叫做实模式,就是访问内存都是真实的内存,相当于他访问的就是内存条里面的内存;

到了保护模式他访问的内存就相当于32位程序写的,第二阶段写程序访问内存,那个是虚拟内存,但是那个内存实际上是映射到内存条里的某个地址的,所以他不是真实的内存

所以16位汇编对硬件的操作是直接操作的,这对你们理解一些硬件的东西还是很有帮助的

然后再者16位汇编调试环境非常恶劣,命令行,然后就是在控制台里面跑

调试的命令到windbg,ollydbg一样是通用的,所以这个学了不就是废了,跟后面有关系的

锻炼调试能力

逆向就是调试,用了debug半个月之后换成OD带界面的,就觉得不错了

debug到了windbg内核,调试内核的专用调试器,用windbg是无缝连接的,命令是通用的,他的命令会更多,到时候介绍更多的命令。

所以真正的十六位汇编是把这节课一拆,剩下的东西全都是32位

所以不要决定讲16位就是讲16位汇编跟32位没关系,

你们可以把这节课一拆,

或者说把这半节课一拆,剩下的全部都是32位,通用

我们讲C++语法的时候会给你们出很多语法题,让你们熟悉语法,到了汇编我们不叫做语法,叫做指令,有各种各样的指令,也需要熟悉指令,但是到了汇编我们熟悉指令的方式不是让你们去练各种各样的语法题了,而是换了一种方式,让你们去写汇编引擎

反汇编引擎

我讲每条指令,你反汇编引擎里面就要加上什么指令,等到16位汇编讲了之后,基本上你们能得到一个能够解析16汇编的反汇编引擎

不停的从二进制数据里面进行拆解,进行组合

其它语法有些训练还是会有的

为啥叫汇编,为啥叫机器码

数字模拟电路基础

数字电路基础

二极管

这边外这边加电是通路

这边往这边加电则是不通的

什么意思呢????

比如这边加电5伏,这边就是5伏的电压

但是如果你在这边加5伏的电压,这边就是0

这个东西是我们的电子设备里面最最基础的一个电子器件,其它的电子器件都是以他为基础组合起来的。

跟我们刚才的二进制数据有啥关系呢???

我们平常存数据0和1,你要知道我们电脑是一种电子设备,听说过电流是吧,电压吧,但是有没有听说过电流电压他有0和1吗??

没有哈

所以这里面其实是怎么回事呢???

其实是用电压去表示的0和1,一般情况下电子器件,

都是5伏电压,表示1

然后接近0伏的话表示0

但是这不是绝对的,有些设备430,是一种低功耗的单片机,电压就是4.3伏

这边加5伏电压,这边出来你可以认为是个1

这边加5伏这边出来之后这是0

所以这个在真正的电子设备里面,根据电压的伏数去代表0和1的,那这个东西跟我们平时电子器件有什么关系呢?

用这个东西组装一台电脑。

二极管组装电脑

我一个二极管是不是可以表示一个二进制的位,那我有两个是不是可以表示2个位啊,

那如果我有8个是不是可以表示一个字节啊

门电路

通过二级管,还有

这个东西叫做电阻

这里的原理我们不探究,只说结论

通过电级管和电阻,他可以组成一种电路,这种电路。

这个电路有什么效果呢?

他是两个输入一个输出

然后这两个输入和输出之间有什么关系呢?

与门

就是比如A端加1,B端加0,他的输出是0

A端加0,B端加1,他的输出是0

A端加1,B端加1,他的输出是1

所以这其实是一个位运算中的与运算

这种电路我们叫做门电路,然后其实门电路还有很多,他除了可以组成位与运算之外,

或门 非门 与非门 异或门

还可以组成很多的位运算

或门,两端只要存在1,输出就是1

先做位与,然后取反,叫做与非门

这个就复杂了

这个时候你会发现,通过刚才的了解,其实硬件最擅长进行位运算。

但是平时写代码,其实位运算干的远远不如四则运算要多吧,那四则运算是怎么办的呢???????

四则运算都是由位运算组合而来的

四则运算 举个栗子:

拿二进制的位来说

加法

1 + 1结果还是0,他要进位。但是我门现在不考虑进位,只考虑本位

通过位运算 表示前面两个位,跟结果之间的关系吗?

是不是异或的关系

相同为0,不同为1

所以说低位,通过异或可以获得

但是他有进位啊,加法是不是有进位

所以怎么判断他有没有进位啊????

这个是不是位与啊

直接通过这两个值做位与运算就能判断出他有没有进位啊

所以你看从二进制的两个位的加法变成了,结果可以通过异或获得,进位可以通过位与去获得。

这是两个位,那么在多一个位呢、??

是不是先算低两位,算出他,然后

在算高两位的啊

这个就不在细推了

依次往后推,可以1字节的,2字节的。。。加法运算都可以通过位与来获得结果,从低位到高位一步步走

这里是加法可以通过位运算去表示

减法

那么减法呢?其实跟加法是一样的吧

减法是不是和他的补码进行相加啊,换种说法,是不是跟他的负数相加啊(就是把符号位置为1就是负数了)

先用位运算能求他的负数把

再去做加法

所以减法也能用位运算去表示

减法其实跟加法是一样的吧,减法是不是就是和他的补码进行相加啊,换句话说是不是跟他的负数相加啊

先用位运算能求他的负数吧,然后在去做加法

所以减法也能用位运算去表示

乘法

位运算 和 加法的组合

讲优化的时候,除法可以通过位运算去表示

为什么拆成4和1?

因为4是2的幂

你拆成2的2次方,他是不是可以直接用位移去表示

所以我门四则运算,或者说数学运算,全部都可以通过位运算去表示,有了最基础的四则运算其它的运算都有了

算术,逻辑单元ALU arithmetic logic unit

当我们有了四则运算可以去把这个运算封装到一个,这硬件封装成一个硬件,抽象一下

封装出来这个东西我门一般叫做算术,逻辑单元

ALU

arithmetic logic unit

封装成一个电子器件去使用,这样省的每次想用数学运算的时候,先挨个二进管,组门电路,在组各种运算

组完之后最后才得到,多麻烦

还不如直接封装

这个东西在电子城也有卖的

这种负责数学运算的,负责数学移位运算的叫做算术逻辑单元

逻辑指的是位操作

但是这个我们知道这有两个端

这里一个端

他是由两个输入一个输出,可以做运算符,这里只支持四种,加减位与,异或

这里面还有个小问题,

比如我这个ALU支持一个字节的算数运算,那就相当于

这可以输入一个字节数可以

这边输入一个字节的数

然后这边输出是一个字节

所以做两个字节的运算

但是这有个问题,我这封装成一个器件之后,但是他有四种功能,那么当你从两个输入端把这个数据输入之后,他如何知道你要做的是那种运算呢?

所以这玩意除了两个输入端一个输出端之外,他还需要一个控制的东西

控制的东西几个位够啊????

一个位就够了,0和1

知道是2位,2个位才能表示4种情况

(加减剩除,与或非异或)

所以光有输入输出之外还会有两个位用来表示控制

那么这个时候当它用的时候怎么用呢?

其实很简单,这样的话,他输入就是8个位,控制2个位

组合起来应该是一个18个位

所以你要给它输入一个18位的数

所以我要做15跟23的加法,我们就按照这里的00,

然后把这个一股脑的输上去,电压加上去,他就会做15加23的运算

然后我门要在位与

这个控制位就要改了

他是2应该是10

做异或,3是11

以前最老的计算机有打孔的,纸条打孔去让计算机干活

剩下的这些,就是里面平常把exe,dll打开,代码那部分所代表的意思

这个东西叫做机器码

机器码其实就是用来控制硬件是如何运行的,

但是机器码怎么说呢,让你门编程写这个玩意,你受的了吗

没有编程语言之前,人们就是这么干的

这里面要是错一个位,然后结果不对了,找这一个位

当年bug这个词怎么来的啊?!

原来电子管,反正比较粗

然后程序跑完之后,出了问题,结果不对,没有达到预期

就找问题,问题到底是哪里呢?

发现电子管里面有个小虫子,然后那个就叫做程序的bug

这个东西给人用太难用了,

所以是不是要给它们取个名字

00给他取个add,10取个名字and ,11异或xor

这样的话去写的时候就可以把他写成

给它取了名字,这样子你要看代码,人通过肉眼去看反正看的很舒服了

但是这个玩意ALU认不认吧

不认

他只认00和01是吧

所以你是不是要把他翻译成00,01啊

汇编

所以这个翻译的过程我门叫做汇编


这个东西可以叫做指令,严格来说叫做助记符

帮你去记他的

这个是很标准的一个

助记符 Mnemonic

后面东西叫做操作数

操作数 Operand

这两个要求记住,因为以后你们肯定会用到各种各样的汇编跟反汇编引擎,汇编引擎里面起的名字就是这两个

一般情况下我们都叫做他叫做指令,

但是在各种汇编跟反汇编引擎里面都把他叫做助记符,

用这个单词

函数名和变量名都是这个单词

Mnemonic取的是指令

Operand取的是操作数

不然看文档估计都看不懂

udis86 反汇编引擎

这是个反汇编引擎

只有数据,没有助记符,这个过程叫做反汇编

指令其实有另外一个单词,

助记符你叫做指令也不算错

回到通过晶体管组电脑的旅程

通过晶体管组成了一个ALU,就是算术逻辑单元,然后你这个算术逻辑单元,其实还可以组更多的东西

但是我门电脑是生活中非常常见的东西,一般电脑是由很多部分组成的,不是只有一个CPU就完事了,光有CPU啥事干不了的

电脑不会由一个电子器件去完成,分成了好多的模块组成

微机系统硬件组成

这些模块里面,各个模块之间如何去进行配合,主要是由一个器件完成的,这个器件我门叫做CPU

突然从ALU跳到了一个完整的硬件系统

这里面封装了很多东西

一般由存储器CPU和显示系统,基本上这三个最基础的东西是需要的

然后显示存储

主存储器,这是内存

这些东西是怎么干活的???

实物图

我们学习的十六位汇编也是运行在8086上的机器码,这个就是一台8086

一般不买8086,一般买的是51单片机

这个叫做引脚,这些都是CPU的输入输出端

现在的CPU都是纳米技术的

要用显微镜去看了

引脚

这个引脚你可以把整个CPU当作电子器件,其实跟其它外界的模型数据通讯的就往这个引脚上加电,加0加1来负责

这里面有用来做地址的,有用来做数据的,还有很多是用来做控制的

有20根地址线

有16根数据线

这些编号其实长得很相似

这里面不是随便写的,这里面都是有意义的,名词全部代表有意义的,

address的缩写用来寻址的

data可以用来取数据的

AD和在一块表名他既可以用来做寻址,也可以用来取数据

是一个复用的引脚

他有很多功能,其实在CPU里面,大部分的引脚都是用在具有复用功能的

有一些锁死总线的可能平时确实用不到,

单一控制的引脚真的很少

大部分的硬件都是一个引脚多个功能

时序 CLK

可以把你CPU这个引脚干掉

这个引脚干掉你的CPU就没有时序了

时序是啥呢?

就是你要给一个

这里加15

这里加23

你是不是要等他运算完了,在给他加啊

那啥时候算他运算完呢???

你要等多久才能

你咋知道他这个输出的不是运算完的

而是原来的数据还是新的数据呢????

我做两次15+23结果是这次的还是上一次的

你是不是很分不清啊

所以就有个时钟,

滴答一次就做一次运算

这个时钟滴答的快不快就决定了你这个CPU运算的速度快不快,最后表现出来是那个数据呢???

这个数据越高说明你这个时钟越快

这个玩意不是说我调时钟就可以完事的,要看你计算机里面电路到底跟不跟的上

比如0.00001微妙做一次运算

那要是有一个器件他发10毫秒他才能跑出来,

那这0.00001微妙有啥用啊是吧

没啥用,取出来的运算结果都是错的

超频是一种技术

这个玩意是怎么跟外面模块进行交互的?

他其实他的引脚是有限的吧,

但是一个CPU的引脚是有限,但是我门加的模块是不是加的有很多

难道几个引脚负责一个模块,几个引脚负责另外一个模块吗?!

肯定不行,因为8086是一个16位的

所以他在存取数据的时候是一次可以存取16位的

这里凡是带D的,一个引脚代表一个位

从0开始

肯定不是我们几个引脚负责一个,比如跟显示模块,往显示模块显示一个字符

一个字符至少一个字节,你要占8位啊

然后你要往内存里面存一个数据,存一个字节也是占8位啊,两个就占玩16位的

你怎么可能这些引脚够用呢?

I/O桥

所以什么东西呢??

会有一个东西负责将所有硬件连接到叫做CPU

这个东西叫做I/O桥。

I/O桥是个什么东西呢???

是一种多路复用器

这里是两个输入端

这里输出端

这边是一个位

这个东西他的功能是什么样子呢??

当你把这个位置为0的时候

只有b端的数据可以输出出来

b端加15结果15,b端加16结果16,b端加17结果17

这个时候不管你a端加什么数据都不会影响结果

这个时候相当于s加0的时候,只有b和这个输出是接通了

当你加1的时候只有a和这个输出是接通的

或句话说这就相当于是一个模块选择器

s0只有b通,a不通;

s1只有a通,b不通

总线

当一个硬件和CPU连上之后,怎么和CPU之间进行通讯呢?

在这个图里面,这个CPU是一个8位的CPU,这个RAM存有256个字节一个RAM

我们来看这个CPU和RAM是如何进行交互的

实际上通过这个例子你们也能看出两个硬件之间进行亲亲我我

数据线8根,控制线2根

CPU对内存的操作会有哪些操作?

可以从内存相对写数据,可以从内存读数据,

不管读写数据也好,是不是要告诉他写的那个地址,读的是那个地址

寻址

所以CPU对内存有三个操作

寻址,读,写

三个操作至少两个位去表示吧

这给了两个控制线

但是有一种情况用不上啊,不管了,反正我门能富裕,绝不能缺

RAM寻址,他有256个字节,你要几个字节的数据能表示0到255啊

其实256个是0-255

一个字节就够了吧,8位

数据地址线,既能做数据,又做数据存取,也能够用作寻址

地址0x14写入0x88

一步是干不完的

首先CPU要告诉他你要操作的地址是多少

寻址是00

8根线用作寻址,所以把地址给它,0x14

然后你要告诉他你要写数据了

写入88

分两次

当你控制端加00的时候,RAM就知道是你在设地址

所以他就把8位线上得数据读做地址,然后就把地址设上去

当你这边设了个10之后,他就知道你要写数据了

这个时候他就把8位线上的位呢当做数据写入之前设的地址

所以你设过地址之后,你想读14所以,你可以直接读

还用的着设数据吗?不用

所以直接给他来个控制线01,他就会从0x14这个地址取出来二进制

然后把他放在这里,这个时候这个CPU可以在下一个时序里面把这个数据给拿走

你要没设新的,当然就用久的,除非不在14了,就要从新寻址

24就要从新寻址

这就是两个硬件之间如何进行数据的交互

他们的交换这里所有的操作都是按位去操作的

硬件组成

这里所有的东西都连到I/O桥上面

然后由I/O桥辅助CPU选择要操作的是那一个设备,当I/O桥选中设备之后他就可以跟设备之间进行数据的交互

这些连到I/O桥上的我门叫做总线

有个东西叫做锁子总线

就是不允许这里设备进行切了,也不允许数据进行一个不给你切设备了

锁子总线

这样我们就了解了一个硬件是如何运行的

一个计算机系统,下面讲的是计算机硬件系统,那么一个真正计算机系统他其实除了硬件他还有软件

类似的图应该见过不少了

当我门了解了硬件之后

我们来回顾一个问题,

比如在这写一个helloworld

从源码到helloworld执行中间发生了什么事?

这个是高级语言

首先他要编译成机器码,机器码存到那呢???

磁盘里面是吧

这个东西运行首先要从磁盘加载到内存里面,然后在去执行,

首先经过一个编译阶段

vs不设置不会给你显示汇编文件,最后链接成可执行文件

加载可执行文件

可执行文件,存到了磁盘里面,

它要运行的话,首先CPU联系I/O桥,控制谁呢?

控制磁盘

然后从磁盘里面把数据读出来

读出来之后放到内存里面,

这个我们叫加载到内存

然后加载到内存之后,内存里面机器码就会源源不断的

CPU就源源不断的从这个内存里面去读他的机器码,然后执行机器码

然后把helloworld显示到图形适配器,界面上面

这就是一个计算机源码执行的一个过程

了解硬件之后, 我们从硬件的角度去看看

下面讲的是CPU如何跟其它硬件交互

我们16位汇编也叫做8086汇编,80286都是16位的到了386就是32位的了

中间有个虚线

大体分成两大块

一块叫做EU执行单元

excute的意思

后面叫做BIU总线接口单元,跟外面做交互的

这里分成几块,这里叫做寄存器

这里是ALU专门做运算的

这个EU控制器

指令队列

地址加法器

外部总线,段寄存器,也是寄存器

EU部件

这里

PPT有点缺

这个CPU怎么干活呢??

首先他要把指令机器码,要从内存里面读进来

之后内存并不是说立马去执行的,立马去做运算的

指令队列

他是先放到这里

这里有一个队列

这里的总线写的是8位

你们看起来像个数组的东西,实际上这是一个指令队列

数组当队列来用

8086指的是他有6个字节的指令队列,就是他能存6个字节

那么他是8位的,他每次取一个字节

取过来的机器码在这里放这

8088只有4个字节,

机器码取过来之后,

给他

前面取指令,这里叫做译码,什么叫做译码呢?

就是你取过来的指令,他其实是功能有多种多样的,他有的可能是访问内存的,有的可能是访问显示设备的,有的可能只是做一个加,减,乘,除,四则运算

,有的可能是要做位运算的

他如果说是访问内存的话,需要在去从外部存储器里面去取数据,但如果说他要做加减运算的话,他其实只要内存做运算就可以了

译码

但是这些东西到底是要做什么的,因为不同的功能会调动的硬件不一样,所以这时候要分析这条指令的功能是啥

分析指令的功能我门叫做译码

译码完了之后就会给ALU去执行

这个我们叫做执行

取指令,译码,执行

这些东西

叫做寄存器

是干什么的??

他如果做两个数的加法,这个时候从内存里面拿出这个数,然后从内存里面在拿出这个数,这两个数做加法,加法的结果变成了自己先存一下

寄存器

所以其实内存有一些自己的相当于局部变量的东西,用来存一些临时数据

这些东西我门叫做专业名词叫做寄存器

他提供了这么多寄存器

这8个叫做通用寄存器

8个寄存器都是16位的

但是稍微还是有些区别

这4个

他内部可以有什么呢?

拆成了2个8位的,2个字节

低字节叫做AL,高字节叫做AH,hight,low

四个字节都是一样的

AH代表AX的高8位,AL代表AX的低8位

可以用AX一次操作16位,也可以分别操作高8位和低8位

起这么多名字好像每个寄存器有专用的用途,实则不是的

除了这两个特殊之外,其它的地位都差不多

为啥取这么多名字呢?

因为寄存器比较少

8086的寄存器比较少

说优化,

因为AX这8个寄存器可以当作是在硬件里面是一个8个dword的数组存的,然后AX位于数组为0的位置,他不用进行下标索引,寻址,所以他的速度最快

这就是所谓的加成

指令做了特别的指令,没啥意义

每一个核心都有这么一套东西

段寄存器

这个先认识下名字,在16位汇编和32位汇编起的作用不一样

指令指针寄存器,标志寄存器

后面我们会讲标志寄存器

这个东西是地址加法器,专门用来算地址的

总线接口就是这部分,因为他是跟外界做交互的,所以他取指令由他负责

由于他是跟外界做交互的,得到的结果,写到内存也是他负责

从内存里面读数据也是他负责

对外的,读写内存;

对内的,专门算地址的,做ALU运算的,算数逻辑运算的,指令队列,还有做译码的

分成多个模块有什么好处呢?

流水线

为了提高效率

有些运算不需要操作内存,所以3和5就可能没有

当他取指令的时候

这里和这里是不是都是空闲的啊

当这条指令在这里进行翻译的时候,译码的时候,

这两个部件都是空闲的

当它进行执行的时候,这里这里

这里都是空闲的

所以他分成多块之后,就可以

第一条指令进来,译码的时候他把指令从指令队列拿完之后,他是不是还可以继续取指令,

当他运行执行的时候

这个译码是不是可以取下一个指令进行译码了,

当它把结果存结果的时候他可以进行下一个指令

这个流水线

这样的话他可以提高硬件的利用率

如果用流水线的话

取指令和取数据是同一个部件干的话,

所以取指令的同时还能取数据把,取下一条指令先停下,把数据取了

取了之后他就会执行了,执行的同时他还可以取第三条指令

执行存结果,存完结果第二个已经开始译码了

这样可以让更少的硬件去闲

这个步骤越多其实相当于划分的部件也多,我门也叫做流水线越深

划分的部件越多,硬件的利用率是不是越高啊

是不是流水线越深利用率越高呢???

123

a1指令1

1234按照顺序走的吧,指令5是一个跳转,流程转移

又要去执行指令2

后面还有个指令6,7

当他进行流水线的时候,a1指令取指令,a2取指令,a1已经译码了,当a1执行的时候,a3取指令,

当a4取指令的时候,a1应该存结果了

比如从a3这里看,当a3在执行的时候,是不是a4在译码,

当a4在译码的时候,是不是a5已经取了指令了

这里取指令可以取多个,a5a6a7可能取了指令了

a3存结果的时候,a4在这执行

a5开始译码

这边可能a6,a7,a8已经在指令队列里面了

然后a5一译码就跳到了a2

他这个时候取的a6a7a8还会执行不?

是不是这个时候指令队列要清空啊

你是不要从新从a2取指令啊,当你这个流水线变的非常深的时候,你是不是清的东西就越多啊

越深清的越多

凡是碰到分支你就要清了,

所以不是说流水线越深越好的

所以现在CPU都会做一种越化,指令预判,什么呢、

到这读指令的时候他会把这些指令执行的次数频繁,根据你这个指令执行频繁的率,次数来判断

如果是重复执行,次数比较多的指令,他可能会帮你加载,然后执行比较少的反而不会去加载

从而提高,减少清流水线的次数

不是说流水线越深越好,但是你要说流水线越短肯定也不好

debug 调试工具

这个工具是16位的工具在XP,跟win7自带的,但是到了win10就没了

环境

用虚拟机直接XP直接用

命令行debug直接用

win10没有模拟16位的东西,不让跑

win10按照dosbox模拟器16位的环境

可以把deubg设置环境变量

刚安装好这是没有的

这个当作虚拟机

vmware不一样的地方

没有盘符,啥盘都没有

所以只有系统没有存储器的

这个命名也没有的,相当于只有系统啥都没有

这个东西允许把你虚拟机内部的盘符映射到你磁盘上的某个文件夹

相当于vmware的共享文件夹

挂载

用的mount工具

别带中文

已经挂载了

dos是一个纯ASCII码的

这边新建,然后dos里面是没有的

但是能进去

要操作的目录不在这里

然后这样d盘已经 挂载了

debug不认识了,要设置环境变量

直接控制台设环境变量

改了就变了

现在

其它命令都不认识了

set是cmd脚本,就是bat

所以我这个直接把path设置到c盘了,可以直接用了

每次启动的时候就没有了

所以启动的时候自动执行一些命令

双击

这里可以把刚才写的命令

一条指令接一行,每次启动都会把你这个指令执行一下

dos player

这个配起来更麻烦

也是dos的模拟器

xcode

编译连接

他有三种,dosbox,jsdos,dosplayer

可以设置

debug使用

大部分用不上

常用的

u

两种写法,

起始地址跟结束地址,可以不跟结束地址

或者

起始地址, l,

list的意思,不是那个竖杠

后面就是跟有几条

不是反汇编的条数

这个2他的机器码,debug里面全部都是十六进制,10也是十六进制

积满了2个字节,下面积满了4个字节

机器码8个字节

反汇编多少个字节

l跟字节数

一半跟一半有意义吗

a

汇编,就是你可以写汇编语句,然后他帮你填成机器码

按回车开始汇编下一行

怎么结束呢?

空行按回车就结束了

a也可以不管跟地址,从上一次中断的地方开始

r

是用来查看寄存器的

8个通用寄存器,4个段寄存器,指令指针寄存器,标志寄存器

还可以修改寄存器的值

改任何寄存器都可以

d

查看内存

也是可以跟range,一样的range

起始地址+结束地址

起始地址+l+长度

e

用来修改内存的

空格

结束直接空字符按回车

这个是原先的值

后面是你要修改成什么值

修改多个

逗号,空格

这是连续改多个值

直接添加字符串

g t p

vs的F5,vs的F11,vs的F10

IP下一条要执行的指令指针寄存器,一下条要执行的指令

步过了,没有进到120

g就是直接运行

写入文件 n,cx,w

把内存里面的数据写到文件里面去

这是由三条命令组成的

n指明文件的名字

cx指明要写的文件的字数

w是写入文件

一样的数据

cx多少就写多少个数据

q

退出debug

标志寄存器

8086里面位于ALU

这是示意图,从寄存器里面存,也会从里面读某些标志

只有一个,flag寄存器

也是16位的寄存器

他是反应ALU的运算的结果的某些状态,

比如两个数相加,他的是16位的CPU

16位CPU最多可以进行两个十六位的数进行运算,换句话说执行两个word的值,进行运算

两个word的值做运算的结果一定是正确的吗?

他最多只能表示16位的数值,所以你这个结果有可能会溢出,

比如加法可能会进位,无符号数叫做借位,有符号数叫做溢出

乘法除法都有可能出问题

所以标志寄存器会反应这些结果,

你这个运算有没有溢出,有没有进位,有没有借位等等

这是执行完一条指令后自动设置的,由CPU自动设置

FLAG标志并没有用完

并不所有的指令都会影响他,一般跟四则运算,位运算相关的

条件标志用来反应结果的

用来控制CPU的,

DF讲串操作在来看,IF讲中断的时候在来看,TF讲断点的时候在来看

方向,中断,陷阱

条件标志位,

CF

表示进位

两个无符号数,做运算,有没有进位,或者有没有借位,减法是借位,加法是进位

把后面的存到前面,既然是存,那么前面至少是一个存东西的,要么寄存器,要么内存

内存讲了寻址在说

CF看这里,如果有进位的话,这边会是CF(CY),然后这里NC就是not crray没有进位

CY

crray yes

有进位

ZF

上面的运算结果都不是0

NZ not zore

ZR

看下AX的值0是吧

OF

溢出标志针对的是有符号数,两个正数相加,结果变成了负数,是不是溢出了

两个负数相加结果变成正数,溢出了

在汇编里面对于机器来说他从来不分正数和负数,怎么知道是正数负数呢?你把他当作有符号,他就是有符号,当作无符号他就是无符号。

在实际的运用当作,如果你的运算是有符号相加 ,那么只用看OF位,

如果说你的两个数,是无符号数相加,那么你就去看CF位就可以了

进位和溢出

这里面核心原则就是看你,跟机器没关系,看你做运算的时候你对这个数是当作有符号还是当作无符号数

SF

符号位,

字节,16位CPU最多运算2个字节,字节看第7位,如果是一个字的话从开始看第15位

PF

运算结果中的低8位中的1的个数,

为偶数的话PF置为1,否则PF置为0

计算结果5个1,所以是0

用作校验

写程序用hash,这个是硬件上的支持

拿这个值跟全1的做位与运算,看低8位1的个数对不对

原先是奇数的1,现在变成偶数的1那就不对了

AF

低8字节,高8字节

低4位,高4位

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容