前言:公号 「编程有料」后台回复 “大礼包” 即可获取近1000本助力你编程之路的电子书
计算机是处理信息的工具,所处理的信息称为数据。计算机的具体工作表现为执行程序,而程序的最终可执行形态是指令序列,即若干用数字代码表示的机器指令。
数据和指令都采用二进制表示,则它们在外形上并无区别,都是由0或1组成的代码序列,只是各自约定的含义不同而已。
a,实现编制程序
b,将程序存储于计算机的存储器之中
c,计算机在运行时将自动地连续地从存储器中依次取出指令加以执行。
计算机硬件系统由运算器、存储器、控制器、输入设备、输出设备五大部件构成。
计算机的硬件是指系统中可以触摸到的物理设备实体。
计算机软件通常泛指各类程序和文件。由于它们在计算机中的表示是一些不能直接接触到的二进制信息,所以称为软件。软件可分为系统软件(操作系统、语言处理程序)和应用软件(通用软件、用户程序)。
1,任意进制与十进制整数之间的相互转换方法:
任意进制转换成十进制的方法是:按权展开后相加即可。而十进制整数转换为任意进制整数的方法较为复杂:首先用基数除十进制数可得商及余数,此余数为任意进制代码的最低位。再用基数除该商数,又可得商数和余数,则此余数为次低位的任意任意进制代码。再用同样的方法继续用基数除下去,直到商为零为止。
如下,举一个将十进制数3转换为二进制的例子:
3除以2得商为1,余数为1,则余数1为二进制代码的最低位。然后再用2除1,可得商为0,余数为1,故最终结果为 “11B”。(小学学的除和除以的区别可别忘记了)
2,十进制小数转换为任意进制小数方法:
不断用基数去乘要转换的十进制小数,将每次所得到的整数部分依次计为X1,X2…,若乘积的小数部分最后能为0,那么最后一次乘积的整数部分计为Xm,则将结果书写为0.X1X2…Xm.(注意:一个十进制小数不一定能完全准确地转换为一个二进制小数)
如下,举一个将一个十进制小数0.25转换为二进制小数的例子:
0.25*2=0.50,其所得的整数部分为0,计为X1.
0.5*2=1.0,其小数部分能为0,即最后一次乘积的整数部分为1,计为X2
则转换的最终结果为:0.01B。同时,你可以试一下将十进制数0.75转换成二进制数,或许你会觉得上面的结论有问题,不过结论是没有问题的,关键是我们要理解取整的含义。
1,十进制整数转换成其他进制整数:除R取余,R为基数(把余数写成二进制数时,注意顺序:从下到上,从左到右)
2,十进制小数转换成其他进制小数:乘R取整,R为基数(从上到下取整,从左到右写数)
在计算机中,若采用定点小数,数的表示范围为|X|<1,如果出现运算结果超出数的表示范围的现象,就称为溢出。
例如:x=+0.1011,y=+0.1001,求x+y。
得出各自的补码后相加,发现结果为1.0100,即两正数相加,结果为负,显然错误。
用两个相同的符号位表示一个数的符号,左边第一位为第一符号位,是结果的真正符号位,相邻的为第二个符号位。定义双符号位的含义为:00表示正号;11表示符号;01表示正向溢出;10表示负向溢出。
还是根据上面那个例子:[X]补=00.1011,[Y]补=00.0111,则计算出来的结果为01.0010,表示的是正向溢出。
对于原码、反码和补码的知识,可以参考这篇文章:一文带你搞懂原码、反码和补码
当操作数中的加数与被加数符号相同时,若运算结果的符号与操作数的符号不一致,表示溢出;否则,表示没有溢出。而当加数和被加数符号不同时,相加运算的结果是绝对不会溢出的。
真值:正、负号加二进制绝对值。例:-001011B、+101101B
机器数:在机器中使用的连同数符一起数码化的数。例:1001011B、0101101B
字长为8位,无符号整数的最大值是(1111 1111)B=(255)D,此时机器数的范围是0~255.
…
在算术运算中,数据是有正有负的,将这类数据称为带符号数。为了在计算机中正确地表示带符号数,通常规定每个字节的最高位为符号位,并用0 表示正数,用1 表示负数。
在机器中,小数点的位置通常有两种约定:
一种规定小数点的位置固定不变,这时的机器数称为“定点数”。
另一种规定小数点的位置可以浮动,这时的机器数称为“浮点数”。
下面一起了解下浮点表示法:
浮点表示法与数学中的科学计数法类似,是指计算机中的小数点位置不是固定的,或者说是“浮动的”。对于任何一个二进制数N都可以表示为:
BCD(Binary Code Decimal)码又称为“二—十进制编码”,专门用来解决用二进制表示十进制数的问题。最常用的是8421编码,其方法是4位二进制数表示1位十进制数,自左至右每一位对应的位权是8,4,2,1,如果按位权求和,和数就等于该数码所对应的十进制数。
例如,二进制数1000 1001B
采用BCD码表示为十进制数89D。
程序告诉计算机:应该逐步执行什么操作;在什么地方找到用来操作的数据,结果存到何处等。
中央处理器是控制计算机自动完成取出指令和执行指令任务的部件,简称为CPU。
CPU具有指令控制、操作控制、时间控制和数据加工(对数据进行算术运算和逻辑运算处理)的作用。
1)控制机器从内存中取出一条指令,并指出下一条指令在内存中的位置;
2)对指令进行译码,并产生相应的操作控制信号,送往相应的部件,启动规定的动作;
3)指挥并控制CPU、内存与输入/输出(I/O)设备之间的数据流动方向。
8086/8088工作模式完全是由硬件决定的。为了尽可能适应各场合,在设计8086/8088cpu芯片时,就使得它们在两种模式下工作,即最大模式和最小模式。
所谓最小模式,就是在系统中只有8086/8088一个微处理器。在这种系统中,所有的总线控制信号都直接由8086/8088产生,因此,系统中的总线控制逻辑电路被减到最少。据此,也不难理解什么是最大工作模式了。
同时,在最大模式下,为了解决主处理器和协处理器之间的协调工作问题和对总线的共享控制问题,在多处理器系统中必须采用总线仲裁器来确定每一个时刻的总线使用权赋予优先级别较高的处理器使用。
微机中各模块、各设备间传输信息的一组公用信号线。
在总线连接和传输信息时应该遵循的协议和规范。包括:时钟、结构、电气、机械等
CPU通过什么将地址、数据和控制信息传到存储器芯片中呢?就是地址线、数据线和控制线。
8086/8088CPU指令执行部件EU中有8个16位通用寄存器,它们可分为两组。一组由AX,BX,CX和DX构成,称作通用数据寄存器,可用来存放16位的数据或地址。也可以把它看做8个8位寄存器来使用,就是将每个通用寄存器的高半部分和底半部分分开。如下图:
4个16位寄存器,主要用来存放操作数的偏移地址(即操作数的段内地址)如下图:
8086/8088CPU中设置了一个16位标志寄存器FLAGS,用来存放运算结果的特征和控制标志。
存放9个标志位如下图:
总线操作是指CPU通过总线对外的各种操作
操作控制器在各寄存器之间建立数据通路。其功能就是:根据指令操作码和时序信号,产生各种操作控制信号,以便正确地建立数据通路,从而完成取指令和执行指令的控制,有:1,硬布线控制器;2,微程序控制器
产生并发出计算机所需的时序控制信号
1个指令周期=若干个CPU周期
1个CPU周期=若干T 周期
寻址方式:形成指令或操作数的内存地址的方式,或者说查找指令或数据的方式。
寻址方式的类别:
1,立即数寻址方式
此方式中指令操作数部分直接给出指令的操作数,它与指令操作码相接,顺序存放在代码段中。立即数有8位和16位之分。
例如:
MOV AH,36H ;就是将立即数36H赋给AH
注意:
2,寄存器寻址方式
此方式的操作数放在寄存器内,由指令直接给出某个寄存器的名字,以寄存器的内容作为操作数。寄存器可以是16位的AX,BXA,CX,DX,SI,DI,SP,BP寄存器,也可以是8位的AH,AL,BH,BL,CH,CL,DH,DL寄存器。
例如:
MOV AX,CX ; AX<---(CX)
DEC AL ;AL<---(AL)
注意:
3,直接寻址方式
此方式的操作数在存储器中,指令中直接给出源操作数所在存储单元的有效地址。有效地址(EA)也称为偏移地址,它代表操作数所在存储单元距离段首地址的字节数。有效地址是一个无符号的16位二进制。
例如:
MOV AH,[2100H] ;将DS段中2100H单元的内容送给AH
MOV AX,[2100H] ;将DS段中2100H单元的内容送给AL,2101H单元的内容送给AH。
注意:
(1)直接寻址方式的操作数所在存储单元的段地址一般在数据段寄存器DS中。
(2)如果操作数在其他段,则需要在指令中用段超越前缀指出相应的段寄存器名。
例如:
MOV AH,ES:[2000H] ;将附加段寄存器ES的内容乘16D(或10H),在加上2000H 作为操作数所在存储单元的地址,取出该存储单元的内容送到寄存器AH中。
4,寄存器间接寻址方式
此方式的操作数在存储器中,指令中寄存器的内容作为操作数所在存储单元的有效地址(偏移地址)。寄存器可以是某个基址寄存器BX、BP,或某个变址寄存器SI、DI。
当使用寄存器BX、SI、DI时,操作数所在存储单元的段地址存在数据段寄存器DS中; 当使用寄存器BP时,操作数所在存储单元的段地址存在堆栈段寄存器SS中。
例如:
已知: (DS)=2100H,(DI)=2000H
指令: MOV AX,[DI]
物理地址=16*(DS)+(DI)
=16*2100H+2000H=23000H
指令执行结果是将230000H和23001H单元的内容送入寄存器AX中。
注意:
5,寄存器相对寻址方式
此方式的操作数在存储器内,指令中寄存器的内容与指令指定的位移量之和作为操作数所在存储单元的有效地址(偏移地址)。寄存器可以是基址寄存器BX、BP,也可以是变址寄存器SI、DI。位移量是一个8位或16位的有符号二进制数。
计算操作数所在存储单元的物理地址时与寄存器间接寻址方式相同,使用寄存器BX、SI、DI时与数据段寄存器DS有关,使用寄存器BP时与堆栈段寄存器SS有关。
以寄存器SI、8位位移量为例,物理地址为:
*物理地址=16 (DS)+(SI)+8位位移量
以寄存器BP、16位位移量为例,物理地址为:
物理地址=16 * (SS)+(BP)+16位位移量
例如:
已知:(DS)=2000H,(SI)=1000H,DA1=2000H(16位位移量)
指令: MOV BX,DA1[SI]
则物理地址=16*(DS)+(SI)+16位位移量
=20000H+1000H+2000H
=23000H
指令执行结果是将23000H和23001H单元的内容送入寄存器BX中。
语句格式:MOV 目的操作数 ,源操作数
功能:将源操作数传入目的地址,源地址内容不变。
应用注意一下几点:
1,MOV指令不改变源操作数内容,不影响标志位。
2,源操作数和目的操作数应该有相同的类型,即必须同为字节型或同为字型。
3,代码段寄存器CS不能用作目的操作数,即不允许给CS赋值。
4,立即数不能用作目的操作数,立即数也不能直接传送给段寄存器。
例如:
若要设置数据段寄存器DS的初值为2000H,不能直接用指令:
MOV DS,2000H
可以用如下两条指令表示:
MOV AX,2000H
MOV DS,AX
5,不允许在段寄存器之间传送数据。
例如:
MOV DS,ES ;为非法指令
6,源操作数和目的操作数不能同时为存储单元操作数。
语句格式:PUSH SRC
功能:将寄存器、段寄存器或存储器中的一个字数据压入堆栈,堆栈指针减2.
语句格式:POP OPD
功能:将栈顶元素弹出送至某一寄存器、段寄存器(除CS外)或存储器,堆栈指针加2。
语句格式:XCHG OPR1,OPR2
功能:将源地址与目的地址中的内容互换
例:
寄存器与存储器之间数据交换
MOV AX,5678H ;(AX)=5678H
MOV BX,0FFFFH ;(BX)=0FFFFH
XCHG AX,BX ;(AX)=0FFFFH,(BX)=5678H
输入指令用来从制定的外设寄存器取信息送入累加器。此指令实现I/O端口与CPU之间的数据传送
用输入指令完成从输入端口到CPU的数据传送;
用输出指令完成从CPU到输出端口的数据传送。
例如:
IN DX,0600H ;(DX)<——0600H
OUT DX,AX ;(0600H)<——(AX)
注意:
1,输入/输出指令只能使用累加器AL或AX接受或发送数据。
2,使用短格式指令,必须将端口地址放入寄存器DX中。
3,输入/输出指令不影响标志位。
1,加法指令ADD
指令格式:ADD DST,SRC
指令功能:把源操作数的值加到目的操作数中。
2,带进位加指令ADC
指令格式:ADD DST,SRC
指令功能:把源操作数和进位标志位CF的值(0/1)一起加到目的操作数中。
3,加1指令INC
指令格式:INC OPR
指令功能是把操作数的值加1(不影响CF)
4,交换加指令XADD
指令格式:XADD oprd1,oprd2
指令功能:先交换两个操作数的值,再进行算术加法操作。
1,减法指令SUB
指令格式:SUB DST,SRC
指令功能:从目的操作数中减去源操作数
2,带借位减SBB
3,减1指令DEC
指令格式:DEC OPR
4,求补指令NEG
指令格式:NEG OPR
指令功能:操作数=0-操作数
比较指令CMP
指令 格式:CMP OPD,OPS
功能:目的操作数减源操作数,与SUB指令一样执行减法,但是不回送相减结果,结果只影响标志位。
1,无符号数乘法指令MUL
指令格式:MUL src,其中,src可以是寄存器或存储单元,但不能是立即数或段寄存器。
功能:两个无符号数相乘。
注意:指令中指定乘数,被乘数默认在寄存器AL或AX中。
2,有符号乘指令IML
语句格式:IMUL SRC
功能:
字节乘法:(AL)*(SRC)—>AX
字乘法: (AX)*(SRC)—>DX,AX
除法指令的被除数是隐含操作数,除数在指令中显示地写出来
1,无符号除指令DIV
语句格式:DIV OPS
功能:
字节除法:(AX)/(OPS)—>AL(商)、AH(余数)
字除法:(DX、AX)/(OPS)—>AX(商)、DX(余数)
2,有符号除指令IDIV
8086/8088规定IDIV指令运算结果余数的符号与被除数相同。