(1MB=1024KB=10241024B=102410248bits 1B(字节)=8bits(位) 1位为0或1 1字(指汉字)=2字节=16位)
1.概念:一组完成某种功能的指令的集合称为程序。一台计算机所能执行指令的集合称为该计算机的指令系统。
2.指令格式的描述
(1)指令信息:包含4个部分
指令操作码(OP)、操作数地址、操作结果的存放地址、下一条指令的地址
(2)指令格式
a.零地址指令:一种是指令不需要操作数,另一种是所需的操作数地址是默认的
b.一地址指令:指令中包含一个操作数地址,该地址指令执行前存放着操作数,指令执行后存放执行的结果。(OP A)
其中,A通常是存储单元、I/O接口或CPU的内部寄存器
例如:SAL AL;算术左移指令,实现寄存器AL的内容算术左移一次
c.二地址指令:( OP A1 A2 功能为 (A1)OP(A2)->A1 )
通常将A2称为源操作数地址,A1为目的操作数地址,用于存放指令执行的结果。
例如:MOV DX,A2;传送指令,实现将内存地址单元A2的内容传送到DX中
d.三地址指令:( OP A1 A2 A3 功能为 (A2)OP(A3)->A1 )
其中,A1为存放指令执行结果的地址
例如:ADD AX,BX,CX;80196的加法指令,实现BX+CX->AX
e.多地址指令
3.指令设计
(1)指令长度的影响因素:指令长度都是字节(或16位的字)的整倍数
a.内存大小与组织
例如:(寻址空间一般指CPU对于内存寻址的能力。CPU最大能查找多大范围的地址叫做寻址能力,CPU的寻址能力以字节为单位)
(4GB=41024MB=4102410241024*8位=2^(2+10+10+10+3)位)
内存寻址空间为4GB时,表示内存地址需要32位编码,当采用直接寻址时,用于表示地址的编码就需要32位。
存储器的传送速度也对指令长度产生一定影响。
b.CPU数据总线宽度
CPU数据总线宽度表示CPU一次读/写内存的数据位数,指令长度应为CPU数据总线宽度的整数倍。
c.CPU内部寄存器的数量
内部寄存器越多,则需要更长的编码对其寻址
d.寻址方式
寻址方式越多,则构成的指令系统的功能就越强,编程效率也会越高。但寻址方式越多,用于描述它们的编码就越长,指令长度也必然加长。
e.指令数量
设计CPU指令系统的指令越多,用于表示指令操作码的编码也会越长,这也会影响指令的长度。
(2)定长操作码变长指令码
若指令操作码为7位,则可以构成128条指令,若指令操作码为8位,共有256种编码,则可以构成256条指令。
(3)定长指令码变长操作码
也称为指令操作码扩展编码方式(见附录4.1)
以8086的CPU为例说明处理器种常用的寻址方式
1.8086处理器中的内部寄存器:首先描述处理器中与应用有关的,用户能用指令改变其内容的寄存器
(见附录4.2)
(1)数据寄存器:4个16位数据寄存器,可以存放16位的操作数;也可分为8个8位寄存器
(2)指针寄存器
(3)变址寄存器
(4)控制寄存器
a.IP(Instruction Pointer)是指令指针寄存器,用来控制CPU的指令执行顺序。它和代码寄存器CS一起可以确定当前所要取的指令的内存地址。
CPU执行程序的地址总是为: CSX16+IP。当顺序执行程序时,CPU每从内存取一个指令字节,IP自动加1,指向下一个要读取的指令字节。当CS不变、
IP单独改变时,会发生段内程序转移。当CS和IP同时改变时,会产生段间的程序转移。
b.程序状态字(Program Status Word,PSW)用来表征当前运算的状态及程序的工作方式。程序状态字寄存器用来保存由算术/逻辑指令运行或测试
的结果所建立起来的各种条件码内容,如运算结果进/借位标志(C)、运算结果溢出标志(O)、运算结果为零标志(Z)、运算结果为负标志(N)、运算结果符号标志(S)等,这些标志位通常用1位触发器来保存。除此之外,程序状态字寄存器还用来保存中断和系统工作状态等信息,以便CPU和系统及时了解机器运行状态和程序运行状态。因此,程序状态字寄存器是一个保存各种状态条件标志的寄存器。
(见附录4.3)
(5)段寄存器
8086微处理器具有4个段寄存器:代码段寄存器CS、数据段寄存器DS、堆栈段寄存器SS和附加段寄存器ES。这些段寄存器的内容与有效的地址偏移量一起可确定内存的物理地址。通常CS规定并控制程序区,DS和ES控制数据区,SS控制堆栈区。
当一个程序要执行时,就要决定程序代码、数据和堆栈各要用到内存的哪些位置,通过设定段寄存器 CS,DS,SS 来指向这些起始位置。通常是将DS固定,而根据需要修改CS。所以,程序可以在可寻址空间小于64K的情况下被写成任意大小。 所以,程序和其数据组合起来的大小,限制在DS 所指的64K内,这就是COM文件不得大于64K的原因。
(6)存储器寻址
(1MB=10241024B=2^20B,8086CPU具有1MB的内存空间)
(64KB=641024B=2^16B)内部寄存器都只有16位,一般是不能寻址1MB存储空间的。
2.8086CPU的寻址方式:决定操作数地址的寻址方式和决定转移地址的寻址方式
(1)决定操作数地址的寻址方式
a.立即寻址:操作数(立即数,可以为8或16位)直接包含在指令中,紧跟在操作码后面,与操作码一起放在代码段区域中。
MOV AL,05H; MOV DX,8000H;
b.直接寻址:操作数地址的16位段内偏移地址直接包含在指令中,与操作码一起存放在代码段区域中。操作数一般在数据段区域中,它的
地址为数据段寄存器DS加上这16为的段内偏移地址。
MOV BX,DS:[2000H]; //DS的内容*16+2000H
c.寄存器寻址:操作数包含在CPU的内部寄存器中
MOV DS,AX
d.寄存器间接寻址:操作数存在存储器中,操作数的16位段内偏移地址放在寄存器SI、DI、BP、BX之一中。
由于这4个默认的段寄存器不同,分两种情况:
e.寄存器相对寻址:操作数存放在存储器中,(与寄存器间接寻址不同的是 增加了一个由指令中所给出的8位或16位带符号的位移量)
例如:MOV AL,[S-2];//操作数的物理地址:DS*16+SI-2=30000H+1000H-2=30FFEH.即从地址30FFEH单元取出一个字节放入AL中。
f.基址变址寻址:将基址寄存器(BX、BP)和变址寄存器(SI、DI)联合起来进行寻址
操作数的地址应该是段寄存器内容乘以16加上基址寄存器的内容(BX或BP),再加上变址寄存器的内容(SI或DI)而得到的
g.基址变址相对寻址:(与上一种方式的不同是再加上由指令指明的8位或16位相对偏移地址而得到的)
例如:MOV AX,DISP[BX][SI];
h.隐含寻址:将操作数的地址隐含在指令操作码中的寻址方式
(2)决定转移地址的寻址方式
a.段内相对寻址:指令应指明一个8位或16位的相对地址位移量DISP(含正负符号,用补码表示)
此时,转移地址位代码段按寄存器CS内容*16+IP+DISP。
例如:JMP SHORT ARTX;//指令中ARTX表示要转移到的符号地址;而SHORT表示地址位移量DISP位8位带符号的数。
此时,转移指令的偏移地址为:IP+DISP8
DISP8是8位带符号的数(-128~127),可向上转移(地址减小的方向)128个单元,向下转移127个单元;
若JMP NEAR PTR PROM指令,NEAR PTR表示用16位带符号的数来表示,(-32768~32767)
b.段内间接寻址:转移地址的段内偏移地址要么存放在一个16位的寄存器中;要么存放在存储器的两个相邻单元中;此时,寻址所得到的不是操作数,而是转移地址。
例如:JMP CX;JMP WORD PTR[BX];
c.段间直接地址:在这种寻址方式中,指令码将直接给出16位的段地址和16位的段内偏移地址。
例如:JMP FAR PTR ADD1;
d.段间间接寻址
例如:JMP DWORD PTR[BP][DI];
1.传送指令
(1)MOV OPRD1(目的操作数或地址),OPRD2(源操作数或地址)
例题:如果要求将内存中一个数据块搬移到另一个内存数据区中去,例如将以AREA1位首地址的100字节数据搬移到以AREA2为首地址的内存中去,可以
用带有循环控制的数据传送程序来实现.为此采用间接寻址方式:
MOV SI,OFFSET AREA1
MOV DI,OFFSET AREA2
MOV CX,100
AGAIN: MOV AL,[SI]
MOV [DI],AL
INC SI
INC DI
DEC CX
JNZ AGAIN
HLT
(2)交换指令XCHG OPRD1(目的),OPRD2(源)
(3)地址传送指令
a.LEA指令LEA OPRD1(目的),OPRD2(源)
b.LDS指令:该指令完成一个地址指针的传送,地址指针包括段地址和地址偏移量。
这条指令通常用来建立串指令操作所需的寄存器指针。例如:LDS SI,[BX];
c.LES指令:这条指令除将地址指针的段地址送入ES外,其他操作与LDS相同。例如:LES DI,[BX+CONT]
另:
a.LEA OPRD1(为16位通用寄存器),OPRD2(为内存操作数); 功能:OPRD2的EA->(OPRD1)
例如:LEA SI,[1000H]; SI<-1000H
LEA DI,[BX][SI]; DI<-BX+SI
(4)堆栈操作指令:由SS的内容和SP的内容决定
PUSH OPRD(压入堆栈指令)
POP OPRD(弹出堆栈指令)
2.算数运算指令
(1)加法指令
例: 1000H:0100H为首地址的1000字节,传送到2000H:0000H开始的内存区。
MOV AX,1000H
MOV DS,AX
MOV SI,0100H ;DS:SI = 1000H:0100H
MOV AX,2000H
MOV ES,AX
MOV DI,0000H ;ES:DI = 2000H:0000H
MOV CX,1000
NEXT: MOV AL,[SI] ;(DS:SI)->AL
MOV ES:[DI],AL ;AL->(ES:DI)
INC SI
INC DI
LOOP NEXT
HLT
(2)减法指令
SUB OPRD1,OPRD2
SBB OPRD1,OPRD2
DEC OPRD
NEG OPRD:取补指令
CMP OPRD1,OPRD2:比较指令 (OPRD1)-(OPRD2)
(3)乘法指令
MUL OPRD
(4)除法指令
DIV OPRD
3.逻辑运算和移位指令
(1)逻辑运算
NOT OPRD 按位取反
AND OPRD1,OPRD2 按位与
OR OPRD1,OPRD2 按位或
XOR OPRD1,OPRD2 按位异或
TEST OPRD1,OPRD2 按位与,结果不保存
(2)移位指令
SAR AL,1;算数右移,即补码右移
4.串操作指令
例如:1000H:0100H为首地址,长度为1000字节的串,传送到2000H:0000H开始的串
MOV AX,1000H
MOV DS,AX
MOV SI,0100H
MOV AX,2000H
MOV ES,AX
MOV DI,0000H
MOV CX,1000
CLD ;DF=0
REP MOVSB
CLD指令功能:将标志寄存器Flag的方向标志位DF清零。在字串操作中使变址寄存器SI或DI的地址指针自动增加,字串处理由前往后。
5.程序控制指令
JMP、JO、JNO、JNS…