计算机组成原理第四章 指令系统与汇编语言

第四章 指令系统与汇编语言
一、指令格式

(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=4
1024MB=4
102410241024*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位寄存器

  • 数据寄存器是存放操作数、运算结果和运算的中间结果,以减少访问存储器的次数,或者存放从存储器读取的数据以及写入存储器的数据的寄存器。
  • 顾名思义,通用寄存器是那些你可以根据自己的意愿使用的寄存器,修改他们的值通常不会对计算机的运行造成很大的影响。
  • AH&AL=AX(accumulator):累加寄存器,常用于运算;在乘除等指令中指定用来存放操作数,另外,所有的I/O指令都使用这一寄存器与外界设备传送数据。
  • BH&BL=BX(base):基址寄存器,常用于地址索引;
  • CH&CL=CX(count):计数寄存器,常用于计数;常用于保存计算值,如在移位指令,循环(loop)和串处理指令中用作隐含的计数器.
  • DH&DL=DX(data):数据寄存器,常用于数据传递。

(2)指针寄存器

  • SP(Stack Pointer):堆栈指针寄存器,与SS配合使用,可指向目前的堆栈在内存中的位置;
  • BP(Base Pointer):基数指针寄存器,通常用于存放基地址,可用作SS的一个相对基址位置;

(3)变址寄存器

  • SI(Source Index):源变址寄存器可用来存放相对于DS段之源变址指针,通常指向源操作数
  • DI(Destination Index):目的变址寄存器,可用来存放相对于 ES 段之目的变址指针,通常指向目的操作数
    (2)(3)寄存器主要用来形成操作数的地址,用于堆栈操作和变址运算中计算操作数的有效地址

(4)控制寄存器
a.IP(Instruction Pointer)是指令指针寄存器,用来控制CPU的指令执行顺序。它和代码寄存器CS一起可以确定当前所要取的指令的内存地址。
CPU执行程序的地址总是为: CSX16+IP。当顺序执行程序时,CPU每从内存取一个指令字节,IP自动加1,指向下一个要读取的指令字节。当CS不变、
IP单独改变时,会发生段内程序转移。当CS和IP同时改变时,会产生段间的程序转移。

  • 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=64
1024B=2^16B)内部寄存器都只有16位,一般是不能寻址1MB存储空间的。

  • 引入的概念,每个内存段具有64KB的存储空间。
  • 该段内的物理地址由16位的段寄存器内容和16位的地址偏移量来确定。
  • 物理地址=段寄存器的内容*16(相当于左移4位,2^4)+偏移地址
    (见附录4.4)在这里插入图片描述

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个默认的段寄存器不同,分两种情况:

  • 若以BX、SI、DI这三个寄存器进行寄存器间接寻址,则操作数默认放在DS所决定的数据段中此时数据段寄存器内容乘以16加上SI.DI.BX中的16位
    段内偏移地址,即得操作数的地址。例如:MOV AX,[SI];//DS*16+SI=21000H
  • 若以寄存器BP间接寻址,则操作数默认存放在堆栈段区域中。此时,堆栈段寄存器SS的内容乘16加上BP中的16位段内偏移地址,即得到操作数的地址。
    例如:MOV BX,[BP];
  • 段超越,例如:MOV AX,ES:[SI];//ES位段超越前缀,指令功能是从ES*16+SI形成的物理地址及其下一个地址中取一个字放入AX中。

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)而得到的

  • 同理若用BX作为基地址,则操作数应该放在数据段DS区域中;若BP作为及地址,则操作数应该放在堆栈段SS区域中。
    例如:MOV AX,[BP][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];

三、8086的指令系统

1.传送指令
(1)MOV OPRD1(目的操作数或地址),OPRD2(源操作数或地址)

  • 可以把一个字节或一个字操作数从源地址传送到目的地址。
  • 累加器、寄存器、存储器可以存放源操作数和目的操作数,源操作数还可以存放在立即操作数中。
  • MOV指令不能在两个存储单元器之间进行数据直接传送,必须借助内部寄存器作为中介。
例题:如果要求将内存中一个数据块搬移到另一个内存数据区中去,例如将以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(源)

  • 该指令把源操作数的地址偏移量传送到目的地址中。源操作数必须是一个内存操作数,目的操作数地址必须是一个16为的通用寄存器。
  • 这条指令通常用来建立串指令操作所需的寄存器指针。例如:LEA BX,BUFR;是把变量BUFR的地址偏移量送到BX中。

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(弹出堆栈指令)

  • 指令中的操作数可以是段寄存器(除CS)的内容、16为的通用寄存器(标志寄存器有专门的出入栈指令)以及内存的16位字。

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…

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值