目录
目录
控制寄存器:IP、PSW(OF、CF、ZF、SF、PF、AF)
数据传送指令:MOV、XCHG、XLAT、PUSH、POP、标志传送指令、地址传送指令
运算指令:ADD、ADC、INC 、SUB 、SBB、DEC、CMP
十进制数调整指令:DAA、DAS、AAA、 AAS、AAM、AAD
移位指令:SAL、SAR、SHL、SHR、ROR、ROL、RCR、RCL
字符串操作指令:MOVS(B/W)、STOS(B/W)、LODS(B/W)、CMPS(B/W)、SCAS(B/W)、REP、REPZ、RZPNZ
第一章 计算机基本知识
计算机系统的概述
- 汇编语言:是一种直接在硬件上面工作的编程语言。
- 汇编语言:是面向机器的语言。
- 汇编语言:重点是如何利用硬件系统的编程结构和指令集有效灵活的控制系统进行工作。
- 完整的计算机系统由硬件系统(就是指我们所能莫到的实物)和软件系统(就是虚拟的,在计算机里面的东西)。
- 硬件是软件建立和依托的基础,软件是计算机系统的灵魂。两者不可分割。
- 用机器指令语句、伪指令语句、宏指令语句表示的一种面向机器的语言称为 汇编语言 。
- 用该语言编写的程序需要经过 汇编 翻译,成为计算机能直接识别并执行的程序称机器语言。
硬件
1.硬件由五大功能部件组成:
下图所示
- 虚线表示:控制信号,起控制的作用
- 实线表示:数据或者指令,在计算机内部,数据指令都是以二进制的形式存储的
2.五大部件之间的联系是由总线(公共的信号线),是计算机中 传送信息的公共通道。
总线(用来传送以下三种信息)有:
- 地址总线(20位):传送地址信息
- 数据总线(16位):传送数据信息
- 控制总线(16位):传送控制信号
3.五大部件的功能
输入设备:如键盘、鼠标、扫描仪等,当计算机要进行数据处理时,必须将程序和数据送到内存转化为计算机所能识别的电信号(0和1)。
输出设备:将产生的各种电信号在显示器上面显示、打印机上打印、外存储器上存放等,将计算机的内部信息传递出去。
运算器:进行算术运算(加减乘除等)和逻辑运算(与或非等,指非算术运算),运算器在控制器的作用下,从内存取出数据在运算器里面进行一系列的操作,处理的结果送回存储器。
控制器:是协调各部件的中枢,就像人的大脑,也就是 计算机中的计算机,指挥并协调计算机的各个部件工作,主要机理是采用内部存储信号来实现。
存储器:用来存放程序和数据,分为主存储器和辅助存储器
- <主存储器>:就是内存,内存储器,在控制器的控制下,与运算器、输入输出设备交换信息,目前都是由超大规模的半导体集成器件组成。由RAM和ROM组成
- RAM:叫随机读/写存储器:在这里面的程序和数据,一旦电脑关机就全部丢失
- ROM:只读存储器:就好像我们电脑里面的数据存储的位置,里面的东西我们在开关机前已经有自己的存储位置,就是说放到了RAM里面。
- 其中运算器的速度很快,主存的速度比运算器要慢,因此在中央处理器内部增加了高速缓冲
- <辅助存储器>:外存储器,外存。比如:U盘,光碟,以前的录音带等。
小总结:CPU(中央处理器)是指:将运算的逻辑部件、寄存器部件和控制部件等集成在一起叫中央处理器。I/O设备叫外部设备,外设,由输入输出设备组成。
软件
1.不同的软件系统工作效率不同
2.系统软件:电脑里面自带的一些系统
应用软件:就好像后期我们根据自己的需求下载的软件
3.系统软件的核心是操作系统。操作系统是最靠近硬件的一层系统
计算机中的数制
数制基本概念
- 位(bit):比特,是计算机中最小的信息单位,存储信息的基本单位是二进制位,用小写的b表示,就是用0或1来表示一个二进制数
,一位可以存储一个二进制位。
- 字节:微机存储器的容量是以字节为最小的单位来计算,是最基本的数据单位,一个八位二进制数表示一个字节,用大写的B表示,一个字节可以表示一个ASCII码,两个人字节可以表示一个汉字国际码。
- 字:是计算机中信息交换、加工、存储的基本单元,用W表示,由一个或者多个字节构成。这里注意,与我们平时理解的汇编存储单元的字节不同,这里的字可以由多个字节构成。
- 有双字(两个连续的字),四字......
- 一个微型存储器的存储单元可以存储一个Byte(也就是8个2进制位)
十进制、二进制、十六进制转化
十六进制转化为二进制十进制
- 十六进制-----二进制:利用8421码,有4位,看我们的十六进制数由8421码的哪些个位置的数相加,就在相应的位置写1,比如:
5H----4+1---->0101 | 17H----1、4+2+1----0001 0111 |
987H----8+1、8、4+2+1----1001 1000 0111 |
- 十六进制----十进制:
342H----2*16^0+4*16^1+3*16^2=2+64+768=834 |
2DEA---A*16^0+D*16^1+E*16^2+a*16^3=11754 |
二进制转化为十六进制和十进制
- 二进制----十六进制:也是用8421码,反推即可,0101---4+1=5
- 二进制转化为十进制:将二进制转化为16进制,再转化为十进制即可
十进制转化为十六进制和二进制
- 十进制----十六进制:
35=16*2+3=23H
7566=472*16+14=16*(16*29+8)+15=16*(16*(16*1+13)+8)+15=1D8FH - 十进制-----二进制:将其转化为十六进制再转化为二进制。
两个16进制怎么加快:
比如:FE+FE
首先是E+E ,看成:14+14=28 ,然后28-16=12(C有进位)
F+F ,看成:15+15 =30 ,30-16=14 ,加进位:15(F)有进位
所以FE+FE= 1FC H
BCD码
- 二进制数是计算机处理容易实现的,但是二进制数不适合人进行处理、书写、纠正等,而且我们人类更喜欢使用的是十进制数,所以计算机中有时候也可以使用十进制的形式来表示,叫十进制的BCD编码方式。
- BCD码也叫:二-十进制数,也就是用4位二进制数表示一位十进制数,表示方法有很多,用得比较多的是8421BCD码,分为压缩BCD码和非压缩BCD码
- 压缩BCD码:其中每位压缩BCD码占4个二进制位表示(也就是一个十进制数占4个二进制位),一个字节可以表示两位十进制数,可以存放两个BCD码(注意:这里和前面的用8421码将十六进制数转化为2进制数不一样,但是都是利用BCD码),比如:十进制数56=(0101 0110B)—这是压缩BCD码
- 非压缩BCD码:好像是只能表示0~9,个位数,其他位不能表示,用1个字节表示一位十进制数,高四位总是0000,低4位的0000~1001表示0~9.例如0000 0100B表示十进制数4.
原码、反码、补码
1.预备知识
- 计算机只能做加法运算,因为计算机的运算器只有加法运算器,没有减法运算器,所以如果想要在计算机中进行减法运算,只能通过加法运算来实现,减去一个数可以看成加上这个数的相反数(也就是负数),但是在计算机的计算过程中也没有负数的概念,因此计算机就引入了一个叫符号位的东西。
2.为什么会产生原码、反码、补码?
- 为了解决计算机做减法和引入符号位的问题。
3.慢慢理解吧,我感觉会有点绕(以下内容是根据另外一位博主写的,我自己看着做了一个总结,我会把连接放后面)
原码:
就是最简单的机器数表示法。最高位为符号位,“1”表示负号,“0”表示正号,这里可以这样理解,既然第一位是符号位,那如果表示为1肯定就代表这个数是有符号数,且为负数,就好像汇编里面的ZF(零标志位),运算结果如果为0,则ZF=1,因为叫零标志位嘛,如果为0,就是我们所说的真,当然ZF就为1啦。
以带符号位的四位二进制数为例:最高位是符号位
这里我们做几个运算:
- 1.(1+2=3)—0001 + 0010 = 0011(3)-----正确
- 2.(+0 +(-0)= -0,0加任何数等于任何数)——0000 +1000 =1000 -----正确
- 3.(1+(-1)= 0)----但 0001+1001 =1010(-2)-----矛盾,这。。。。
我们可以看出来,正数之间的加法是符合我们正常的逻辑思维,但是正数+负数和 负数+ 负数 会产生错误的结果。对于原码有符号位,所以说0有+0和-0
这里我们可以知道,原码直观易懂,很容易就可以实现正数负数转换,但是不适于实现减法的运算-----因此就产生了反码。
反码:从原码我们可以看出,一个数加上它的相反数不为0,按道理应该是要为0的。
(1+(-1)= 0)----但 0001+1001 =1010(-2)
- 1.对于一个自然数,负数是正数的相反数,所以就产生了将正数按位取反的方式来表示负数。
- 2.正数的反码等于原码
- 负数的反码就是除符号位外,其他位取反
- 3.比如:3的反码等于原码,为0011,-3的原码是1011,反码就为1100
再 利用反码进行运算:得到的是反码(二进制相加过程符号位不变)
- 1+(-1)=0 ----0001 +1110 = 1111(-0)-----是-0,但是也算是解决了
- (-1)+(-2)= --3------1110+1101 = 1011(-4)----好像又出问题了
但是我们观察可以看出:(-4)的反码为1011,但1011用原码表示就是(-3),这里可以留一个疑问???? - (-1)+(-3)=(-4)---- 1110 +1100 =1010(-5)----但1010的原码-2,所以上面的例子只是一个巧合,我们发现,正数加负数解决了(第一个例子),但是负数和负数相加还没有解决------?????
思考一下:
- 我们解决的是减法问题,在做减法运算时,把减法当做加法来进行运算。
- 这里两个正数相加和两个负数相加,都是加法问题,只是有无符号位的问题,然而正数加负数才是我们考虑的减法问题。所以反码我们解决的是正数加负数的问题
- 用原码表示两个负数相加,在不发生溢出的情况下,只有符号位会出错。
- (-1)+(-2) = (-3)------原码:1001 + 1010 =0011(符号位没了)
- 所以对于反码中负数相加会出现错误,我们可以在实现两个负数相加的时候,将两个负数反码包括符号位按位取反再相加,最后在将符号位强行加1就可以了。
- 所以用反码计算减法问题就解决了:-2(原码:1010,反码:1101)
- 1+(-2)=(-1)----0001 + 1101 = 1110(反码)
- (-1)+(-2)=(-3)----反码:1110 + 1101=0011 (取反:0001+0010=0011后将结果符号位变1,1011(-3))
- 但是:1+(-1)=0-----反码:0001+1110 = 1111(-0),为什么是-0呢,这个问题还没有解决。
- 这里引入了补码。
补码:正数的补码是原码;
负数的补码是反码+1 (对于补码的思想,还值得研究,后面再研究吧)
连接:https://blog.csdn.net/afsvsv/article/details/94553228
机器语言、汇编语言、高级语言
低级语言:机器语言和汇编语言,高级语言就是C、c++、java等
第二章 80X86微处理器及系统结构
8086微处理器结构
8086的内部结构是16位(Byte)的,内外数据总线均为16条,可以处理16位和8位的数据
但是其地址总线是20位的,所以其寻址能力是:2^20B=1MB,范围是00000H ~ 0FFFFFH
- 8bit=1Byte
- 1B=8bit= 2 ^3bit(1B 就是一个存储单元)
- 1KB=1024B = 2^10B
- 1 MB = 1024 KB = 2^10*2^10=2^20B
- 1 GB = 1024 MB
- 1 T = 1024 GB
1.对于指令执行单元:EU
- 组成:ALU(算术逻辑单元)、标志寄存器、数据寄存器、EU控制单元组成,指令的执行过程中,取指部分和执行指令部分是分开的,当一条指令刚开始执行的时候,同时就可以取下一条指令放入指令缓冲器中排队,这样一但前一条指令一结束就可以立马从指令缓冲器里面取出下一条指令,大大提高了CPU的利用率和执行速度
- EU的主要功能:
1.根据指令进行算术和逻辑运算
2.EU计算出指令要 求 的寻址单元地址的偏移量,送到BIU,通过地址加法器形成一个20位的物理地址,到相应的位置去存取接下来的操作。(后面的寻址方式)
2.总线接口单元BIU:负责CPU和存储器之间的信息传送。
- 组成:
由地址加法器、段寄存器、指令指针IP、指令队列、总线控制逻辑组成 - 主要功能:
1.从内存的指定单元取出指令送入到指令队列中去排队。
2.指令执行过程中的所需要的操作数由BIU从指定的区域取,传送给EU去执行
上面我们有提到以下几个东西:
指令队列:其是一个大小为6字节的寄存器,所以指令队列里面最多存放6个字节指令,因为是一个队列,所以遵循先进先出的原则。当指令队列为空时,BIU自动执行总线的操作,取指令存入指令队列再执行。当程序发生转移的时候,BIU需要重新取指令执行,这时取的指令不用放到指令队列,而是直接存入EU去执行,执行的同时BIU依旧会不断的取指令。
地址加法器:是将指令指针IP和段寄存器CS或者将EU送来的偏移量与段寄存器DS形成一个20位的物理地址,从寄存器中取出指令或者数据。
- 其中指令执行单元EU和总线接口单元BIU的操作是独立进行的,所以两者可以一起工作,就是前面我说到的当EU在执行指令的同时,BIU就可以将下一条指令存放到指令队列里面。
过程如下:
寄存器
寄存器位于内存储器的特殊区域的说法是错误的。
寄存器是一种特殊的存储器,这样说才对。
微机一般分为主机(含CPU、内存)和外设(含外存、I/O设备)。
寄存器一般视为CPU的一部分,所以“寄存器是一种特殊的内存储器”根本不对。
如果按照冯·诺伊曼模型,分为I/O设备、运算器、控制器、存储器,这种分法又没有将内存储器单独提出来,所以这句话还是错的。
“寄存器是一种特殊的存储器”,这样说才对。
寄存器到后面会用到,用到再说
控制寄存器:IP、PSW(OF、CF、ZF、SF、PF、AF)
8086有两个控制寄存器:IP---指令指针寄存器,PSW或flags---标志寄存器或叫程序状态字寄存器
- IP
用来存放CPU要执行的下一条指令,存放代码段中的偏移地址,程序运行时,BIU自动自动修改IP,IP始终指向下一条指令的首地址,与段寄存器CS联合使用,指向下一条指令的物理地址CS:IP - PSW
其中条件码标志有六个:
作用是用来记录程序运行结果的状态信息,运行的结果由CPU自动设置,后续主要用于条件转移控制的条件,所以叫条件码。
- OF(OverFow Flag):
溢出标志,仅仅对于有符号数。在运算过程中,如果操作数超出了机器所能表示的范围,OP自动置1(OF=1),否则置0。(如果是八位:+127 ~ -128,16位:+32767 ~ -32768 )
有符号数相加,如果结果的符号数和操作数的符号数相反,则OF=1 - CF(Carry Flag):
进位标志,仅仅对于无符号数,对于无符号数没有溢出的说法,只是说表示不下,超出范围,所以有进位,记录运算时是否有从最高有效位产生进位或者借位,有进位则CF=1,否则CF=0 - SF(Sign Flag):
符号标志位,表示有符号数运行结果的正负,结果为负时SF=1,否则SF=0; - AF(Auxiliary Carry Flag):
辅助进位标志,记录运算时第3位产生的进位值,运算时第3位有进位值:AF=1,否则ZF =0 - ZF(Zero Flog):
零标志位,当运算结果为0时,ZF=1,运算结果不为0,则 ZF= 1 - PF(Parity Flag):
奇偶标志,当结果操作数(二进制数)中1 的个数为偶数个时:PF=1,为奇数个时PF=0,常用于检验是否产生数据传输错误。
控制标志有三个:
- DF(符号标志):
用于在进行串处理指令中控制处理信息的方向,当DF=1时,每次操作后SI和DI自动减小,实现了串处理时从高地址向低地址方向进行处理。DF=0时,SI和DI增大,使串处理从低地址向高地址方向处理。 - TF(陷阱标志):
也叫单步跟踪标志,在DOS环境下,调试程序用的T命令就是这个实现单步调试,TF=1时,每条指令后会产生陷阱,由系统控制计算机,TF=1时,CPU正常工作,不产生陷阱。 - IF(中断标志):
当IF=1时,运行CPU相应外部可屏蔽中断请求,否则关闭中断禁止外部中断请求,本标志对外部中断进行管理。
在DEBUG中,不会显示什么ZF=1或者CF=1,而是如以下显示
8086存储器的组织,存储单元的地址和内容
- 在存储器里是以字节为单位存储信息,为了正确存放和获得信息,给每一个字节单元一个唯一的存储地址,称为物理地址。地址都是从0开始标号的。
- 8086存放 存储地址 的寄存器字长为16位,因此每个存储单元若用16位二进制数表示地址,2^16=65536个,所以地址的表示范围是 0 ~ 65535,及64KB(1K=2^10=1024,64KB=2^10*2^6Byte),注意地址的编号是用十六进制,所以范围是0000H~FFFFH
- 同样,8086的地址总线为20位,所以其可以访问的字节单元地址范围为 00000H ~ FFFFF H
- 当机器的字长是16位时,而且大部分数据都是以字长为单位表示的,当一个字长数据存入存储器时要占用两个连续的存储单元,存放时,低地址放低字节,高地址放高字节
存储地址的分段
- 8086微处理器的地址总线,我们在编写程序的时候,要把存储器分段,其中每个段的地址可以是任意取的,取的大小只要在64KB的范围内都可以,然而段的起始地址是不可以随意取的,必须从每一段的首地址开始,而且是从0开始的。在1MB的地址空间里面,可以有64K个小段首地址,可以表示为00000H、00010H、00020H、……FFFF0H,为什么不是(FFFFFH,为什么后面都还有一个0,猜测有一位为偏移地址)。
- 在1MB的存储器里面,每一个存储单元都有一个唯一的20位地址,叫存储单元的物理地址。CPU访问想要访问的存储单元时,必须先要知道存储单元的物理地址。但是CPU里面都是16位的,然而存储器里面的存储单元都是一个20位的地址。所以有物理地址=段地址+偏移地址。
- 物理地址:
20位的物理地址由 16位的段地址 和 16位的偏移地址 组成,段地址就是前面说到的每一段的起始地址(也叫段基地址),因为其必须是小段的起始地址,所以其低四位一定是0000,所以段地址只取段起始地址的高16位值,偏移地址则是指段内相对于起始地址的偏移值,偏移地址的也是16位的。
- 以下图是物理地址的形成过程:而且我们可以知道,物理地址可以是唯一的,但是偏移地址和段地址可以是变化的,只要最后的结果计算出来是一个20位的物理地址即可。
- 在8086微处理器中,有四个专门用来存放段地址的寄存器,叫段寄存器
DS(数据段寄存器)、CS(代码段寄存器)、SS(堆栈段寄存器)、ES(附加数据段寄存器)。每一个段寄存器可以确定相应段的起始地址,每一个段都有自己各种的用途
CS(代码段):用来存放当前正在运行的程序(必须有)
DS(数据段):用来存放当前运行程序所用的数据。
SS(堆栈段):定义堆栈所在的区域,堆栈是一种数据结构,它开辟了一个比较特殊的存储区域