80x86及Pentium指令系统
- 位(bit):每一位只有两种状态0或1。计算机能表示的最小数据单位。
- 字节(Byte):8位二进制数为一个字节。计算机基本存储单元内容用字节表示。
- 字(Word):PC常将2个字节定义为一个字,一个字为16位二进制数。微处理器内部数据传输、处理基本单位。
- 指令:由0和1组成的代码。让微处理器进行某种操作的命令。
- 指令系统:一台计算机能识别的全部指令。
- 程序:为了使计算机完成某种工作而编制的一系列指令。
- 存储器:存储数据和程序。可以把存储器看成很多存储单元,每个存储单元存8位二进制编码(1字节)。存储单元编号称为存储地址。
- 存储容量单位:1B=8bit;1KB=1024B=1024×8bit;1MB=1024KB;
1.指令中包含的信息
- 指令中一般包含的信息有操作码和操作数 操作码用来指明操作动作和操作数存放位置。
- 操作数可分为两类,一类是数据型操作数,一类是地址型操作数,提供指令中要处理的操作数据或操作数所在位置的一些信息。
- 操作数的个数和所在位置不同,操作数的描述方法不同,指令长短也不同。
- 寻址指的是在指令中给出操作数的值或给出操作数所在位置的信息,解决操作数的值为多少,放在什么地方,操作结果送到哪里去的问题。
- 操作数可以处于计算机的指令代码中,CPU内部的寄存器中,存储单元中,I/O端口中。
2.寻址方式
寻址方式即寻找操作数或操作数所在位置的方式,操作数在计算机中所处的位置不同,寻址方式也不同。
8086CPU的数据寻址方式有隐含寻址方式,数据型操作数寻址方式,目标地址寻址方式。
隐含寻址方式,
- 指令中隐含规定了操作数所在位置,
- 如压栈指令隐含规定使用了SS和SP。
数据型操作数寻址方式:
- 立即数寻址,操作数在指令中;
- 寄存器寻址,操作数在寄存器中;
- 直接寻址、寄存器间接寻址、基址寻址和变址寻址、基址变址寻址、串操作寻址,操作数在存储器中;
- 直接I/O端口寻址、寄存器间接I/O端口寻址,操作数在I/O端口中。
目标地址寻址方式:
- 相对程序寻址,
- 直接程序寻址,
- 间接程序寻址。
3.数据型操作数寻址方式
3.1立即数寻址:
- 操作数直接存放在指令中,在操作码之后,取指令时直接存入处理器内部指令队列中.
- 执行时不需要执行总线周期,运行速度快,所以这种操作数称为立即数。
- 立即数可以是8位、16位、32位。如果是16位或32位数,操作码后紧跟着低字节,而后是高字节。
- 立即数只能作为源操作数,可用于给寄存器或内存赋值。
1. 立即数寻址举例
2. MOV BL,10; 10进制数10送到8位寄存器BL中
3. MOV AX,12H;
4. MOV AX,'AB'; AL存42H,AH存41H
5. MOV CL,10011001B;
6. MOV EBX,10011001H;
3.2寄存器寻址:
- 操作数在处理器的某寄存器中(通用寄存器和段寄存器)。
- 寄存器寻址不需要执行总线周期,运行速度快,
- 对于16位操作数,寄存器可以是AX、BX、CX、DX、SI、DI、SP、BP和段寄存器CS、SS、DS、ES等;
- 对于8位操作数,寄存器可以是AL、BL、BH、CL、CH、DL、DH。
- 在80386以上CPU中,也可以是扩展的32位寄存器。
- 不允许的指令格式:段寄存器间直接传输,如MOV
ES,DS;混合尺寸,如MOV BL,BX;代码段寄存器作为目标操作数,如MOV CS,AX;
1. 寄存器寻址举例
2. MOV AL,BL;
3. MOV AX,BX;
4. MOV DX,AX;
5. MOV ESP,EDX;
3.3操作数在存储器中:
- 需要用逻辑地址描述操作数所在的位置,用段基值:偏移量来描述操作数。
- 段基值存入段寄存器,偏移量用有效地址EA描述(effective address).
- 物理地址=段基值×16+EA。逻辑地址书写为段寄存器:[EA]。
- EA由三个地址分量合成,基址寄存器(BX或BP)内容、变址寄存器内容(SI或DI)、指令中给出的位移量三部分之和。
- 基址寄存器BP、BX只能选用其中一个,变址寄存器SI、DI也只能选用一个,
- 位移量n可以是0、8、16位二进制数,80386以上可为32位二进制数。EA中3个分量有4种组合方式,从而形成了4种寻址方式。
- 直接寻址:指令中直接给出操作数的有效地址,EA=n。直接寻址默认段寄存器为DS,可缺省,但是使用其他段寄存器必须指明。
1. MOV AX,[200H]; 将DS*16+200H所指向的字单元的内容传送到寄存器AX中
2. MOV AX,ES:[100H]; 将ES*16+100H所指向字单元内容送入AX
3. MOV DA+3,CL; 将CL送到EA为DA+3,段基值为DS的存储单元中
3.3.1寄存器间接寻址:
- 操作数的有效地址EA直接从寄存器(BX、BP、SI、SD之一)中获得。
- 存放操作数有效地址的寄存器必须用[]括起来,表示寄存器内容为操作数的地址分量。
- 使用BP时默认段寄存器为SS,未使用BP时,默认段寄存器为DS。
1. MOV AX,[BX]; DS和BX寻址的存储单元的字内容复制到AX中
2. MOV [BP],DL; DL内容送到SS和BP寻址的存储单元
3. MOV ECX,SS:[EBX]; SS和EBX寻址的双字取出并送入32位寄存器ECX中
4. MOV DS:[BP],DL; DL内容送到DS和BP寻址的存储单元,此时DS不能缺省
3.3.2基址寻址和变址寻址:
- 操作数的有效地址EA是是基址寄存器(BP或BX)或变址寄存器(SI或DI)与指令中给出的位移量(0、8、16位数据)之和。
- 使用BP时默认段寄存器为SS,未使用BP时,默认段寄存器为DS。
1. MOV AX,[DI+100H]; DS*16+DI+100H所指的存储单元的字送到AX
2. MOV BL,SETS[BP]; SS*16+SETS+BP所指的存储单元内容送到BL
3. MOV ARAY[EBX],AL; AL内容送到DS*16+ARAY+EBX所指单元中
3.3.3基址变址寻址:
- 操作数的有效地址EA是三个地址分量之和,即一个基址寄存器内容,一个变址寄存器内容与指令中给出的位移量之和。
- 基址寄存器BX和BP只能选其中一个,变址寄存器SI和DI也只能选一个。
- 使用BP时默认段寄存器为SS,未使用BP时,默认段寄存器为DS。
1. MOV DH,[BX+DI+20H]; DS*16+BX+DI+20H所指存储单元的内容送到DH
2. MOV AX,FILE[BX][SI] DS*16+BX+SI+FILE所指的字存储单元内容送到AX
3. MOV ES:LIST[BP+DI],CL; CL送到ES*16+BP+DI+LIST所指的存储单元中
4. MOV LIST[BP+SI+4],DH; DH送到SS*16+BP+SI+4+LIST所指的存储单元中
3.3.4串操作寻址:
- 源操作数为DS:[SI],目标操作数为 ES:[DI]。
- 串操作自动对SI、DI两个地址指针进行修改,使其指向下一单元,修改方向由标志寄存器FR中DF方向标志决定,DF=1,SI、DI自动减1或2;DF=0,SI、DI自动加1或2。
- 当字操作时指针增减量为2,当字节操作时指针增减量为1。
1. MOVSB; 字节串传送,将DS:[SI]中的字节传送到ES:[DI]中,同时SI、DI自动减1(DF=1)或SI、DI自动加1(DF=0)。
2. MOVSW; 字串传送,将DS:[SI]中的字节传送到ES:[DI]中,将DS:[SI+1]中的字节传送到ES:[DI+1]中,同时SI、DI自动减2(DF=1)或SI、DI自动加2(DF=0)。
3.4操作数在I/O端口中:
- 分为8位地址直接寻址,16位地址DX间接寻址。
- I/O端口不分段,直接把输入/输出指令中给出的端口地址送上地址总线,数据只能由累加器AX或AL通过数据总线传输。
- I/O端口数据输入指令IN,I/O端口数据输出指令OUT。
1. IN AL,n8; 将端口地址为n8的I/O端口中的8位数据读入AL中。
2. IN AX,n8; 将端口地址为n8的I/O端口中的16位数据读入AX中。
3. IN AL,DX; 将以DX内容为端口地址的I/O端口中的8位数据读入AL中。
4. OUT n8,AL; 将AL中的8位数据送到端口地址为n8的I/O端口中。
5. OUT n8,AX; 将AL中的16位数据送到端口地址为n8的I/O端口中。
6. OUT DX,AX; 将AX中16位数据从到以DX内容为端口地址的I/O端口中。
4.目标地址寻址方式
目标地址寻址,操作数为目标地址,如转移指令中的目的地址、调用指令中的子程序入口地址等。
4.1直接程序寻址
- 指令中直接给出指令所需要的目标地址信息。
- 如果程序希望转移到1A000H处,目标地址以逻辑地址的形式跟在操作码后面,
- 如转移指令:JMP 1000H:A000H,由5个字节组成,1个字节为操作码,4个字节存放目标地址,执行指令时将1000H装入CS,A000H装入IP,使下一条指令从1A000H处执行。
- 汇编语言程序中,程序转移的目标地址通常不用实际的数字地址表示,而用叫做标号的内存地址名表示。
- JMP LP;跳转到标号LP处。CALL SUB1;调用标号为SUB1的子程序。
4.2相对程序寻址
- 指令书写时指明转移目标地址的IP值或标号,但是相应指令代码由操作码和1~2个字节位移量disp(补码)构成,
- disp=目标地址IP值-当前IP值,位移量disp是转移的目标地址相对于当前指令指针的距离信息。
- 例如JMP 0004H为2字节的相对转移指令,假设它已被存入偏移量为0000H的字单元中,取出该指令后的IP值=0002H为当前IP值,0004H为目标地址的偏移量,位移量disp=0004H-0002H=2,该指令的功能是将当前IP值加上disp,找到下一条程序指令所在单元的有效地址为0004H并存入IP中,使下条指令从1000H:0004H开始。
4.3间接程序寻址
- 指令中目标地址在寄存器中或在存储器中。
- 例如JMP [DI+2],指令的功能是转移到目标地址处,目标地址的有效值在DS:[DI+2]内存单元中,假设DS地址为1800H,DI为0100H。
- 第一步取指令,从当前的CS(1500H)和IP(0300H)内容指向的存储单元中取出3字节指令,取完指令IP=0303H称为当前IP值,CS值不变。
- 第二步寻找目标地址所在位置,物理地址:DS×16+DI+2=18102H。
- 第三步从物理地址指向的单元中取出里面的内容,假如是0A02H,放到IP中,从而使CP:IP指向下一条指令所在的位置1500H:0A02H。