当前位置:文档之家› 第3章 指令系统

第3章 指令系统

第3章 指令系统
第3章 指令系统

第3章 指令系统

3.1 指令系统的概述及符号约定

指令是CPU执行某种操作的命令。微处理器(MPU)或微控制器(MCU)所能识别全部

指令的集合称为指令系统或指令集。指令系统是制造厂家在设计CPU时所赋予它的功能,用户必须正确的书写和使用指令。因此学习和掌握指令的功能与应用非常重要,是程序设计的基础。本章将详细的介绍SPCE061A指令系统的寻址方式和各种指令。

μ’nSP?单片机指令按其功能可划分为:

1) 数据传送指令,包括立即数到寄存器、寄存器到寄存器、寄存器到存储

器存储器到寄存器的数据传送操作;

2) 算术运算,包括加、减、乘运算;

3) 逻辑运算,包括与、或、异或、测试、移位等操作;

4) 转移指令,包括条件转移、无条件转移、中断返回、子程序调用等操作;

5) 控制指令,如开中断、关中断、FIR滤波器的数据的自由移动等操作。

按寻址方式划分,可分为以下几类:

立即数寻址

这种寻址方式是操作数以立即数的形式出现,例如:R1 = 0x1234,是把16

进制数0x1234赋给寄存器R1。

存储器绝对寻址

这种寻址方式是通过存储器地址来访问存储器中的数据,例如:R1 =

[0x2222],访问0x2222单元的数据。

寄存器寻址

这种寻址方式是操作数在寄存器中,例如:R1 = R2,是把寄存器R2 中的数

据赋给寄存器R1。

寄存器间接寻址

这种寻址方式是操作数的地址由寄存器给出,例如:R1 = [BP],是把由BP

指向的内存单元的数据送寄存器R1。

变址寻址

这种寻址方式下,操作数的地址由基址和偏移量共同给出,例如:R1 =

[BP+0x34]。

表3.1中的符号是在指令系统叙述过程中所要用到的,在此统一进行约定。

表3.1 符号约定

R1,R2,R3,R4,R5(BP) 通用寄存器

PC 程序计数器

CS,DS SR寄存器中的代码段选择字段和数据段选择字段

NZSC SR寄存器中的四个标志位(请参考下面几行)

SR 段寄存器,其中BIT15~BIT10对应DS;BIT9~BIT6对应NZSC标志位; BIT5~BIT0

对应CS

IM6 6位(BIT)的立即数

IM16 16位(BIT)的立即数

A6 6位地址码

A16 16位地址码

Rd 目的(destination)寄存器或存储器指针

Rs 源寄存器或存储器指针

→数据传送符号

MR 由R4,R3组成的32位结果寄存器(R4为高字节,R3为低字节)

&,|,^,逻辑与记号,逻辑或记号,逻辑异或记号

{} 可选项

[] 寄存器间接寻址标志

++,- - 指针单位字增量,字减量

ss,us 两个有符号数之间的操作,无符号数与有符号数之间的操作

Label 程序标号

FIR Finite Impulse Response(有限冲击响应),数字信号处理中的一种具有线性相位及任意

幅度特性的数字滤波器算法。

N 负标志,N=0时表示运算前最高有效位为0,N=1表示最高有效位为1。(请参考2。1

节)

Z 零标志,Z=0表示运算结果不为0,Z=1表示运算结果为0。

S 符号标志,S=0表示结果不为负,S=1表示结果为负数(2的补数),对于有符号运算,

16位数表示的范围-32768~32768,若结果小于零,则S=1。

C 进位标志,C=0表示运算过程中无进位或有借位产生,C=1表示有进位或无借位产生。

// 注释符

3.2 数据传送指令

数据传送指令是把源操作数传送到指令所指定的目标地址。数据传送操作属复制性质,而不是搬家性质。指令执行后,源操作数不变,目的操作数为源操作数所代替。通用格式是:

<目的操作数>=<源操作数>

源操作数可以是:立即数、寄存器直接寻址、寄存器间接寻址、直接地址寻址、变址寻址等。

目的操作数可以是:寄存器和直接地址寻址。下面按寻址方式来介绍SPCE061A 的数据传送指令。各个数据传送指令的执行周期数、指令长度等可参见0。 立即数寻址

【影响标志】 N ,Z 【格式】 Rd = IM16

//16位的立即数送入目标寄存器Rd

Rd = IM6

//6位的立即数扩展成16位后送入目标寄存器Rd 【举例】 设传送前 N=0,Z=1,S=0,C=1 R1=0xF001

//R1的值变为0xF001,N=1,Z=0,S=0,C=1

寄存器寻址

【影响标志】 N ,Z 【格式】 Rd = Rs //将源寄存器Rs 的数据送给目标寄存器Rd 【举例】 设传送前 N=0,Z=1,S=0,C=1 R2=0xF001

//R2的值为0xF001,N=1,Z=0,S=0,C=1

R1=R2

// R1的值变为0xF001,N=1,Z=0,S=0,C=1

直接地址寻址 【影响标志】 N ,Z 【格式】 [A6] = Rs //将源寄存器Rs 中的数据送给以A6为地址的存储单元

[A16] = Rs //把Rs 数据存储到A16指出的存储单元 Rd = [A6] //把A6指定的存储单元数据读到Rd 寄存器

Rd = [A16] //把A16指定的存储单元数据读到Rd 寄存器 【举例】

设传送前 N=1,Z=1,S=0,C=1

R1=0x0011

// R1的值为0x0011,N=0,Z=0,S=0,C=1

[0x0010]=R1 //[0x0010]单元的值变为0x0011 变址寻址 【影响标志】 N ,Z

【格式】 [BP + IM6] = Rs //把Rs 的值存储到基址指针BP 与6位的立即 //数之和指出的存储单元。

Rd = [BP +IM6]

//把基址指针BP 与6位的立即数的和指定的存

//储单元数据读到Rd 寄存器。 【举例】 假设执行前 N=0,Z=1,S=0,C=1

R1=0x0010

[BP+0x0002]=R1

//N=0,Z=0,S=0,C=1

寄存器间接寻址 【影响标志】 N ,Z 【格式】

[Rd] = Rs

//把Rs 的数据存储到Rd 的值所指的存储单元。

//Rd 中存放的是操作数的地址。

【举例】 [++Rd] = Rs //首先把Rd 的值加1,而后Rs 的数据存储到Rd 的 //值所指的存储单元间接寻址的存储单元

Rd = [Rs++] //读取Rs 的值所指的存储单元的值并存入Rd ,而 //后、Rs 的值加1

[例3.1]:将R3的值保存于0x25单元

R3 = 0x5678 //把16位立即数0x5678赋给R3

方法1:

[0x25] = R3 //将R3的值存储于0x25存储单元,直接地址寻址

方法2: //0x25单元的内容为0x5678

R2 = 0x25 //立即数0x25送入R2中

[R2] = R3 //将R3的值存储于0x25存储单元,寄存器间接寻址

方法3: //0x25单元的内容为0x5678

BP = 0x20 //立即数0x20送入BP中;

[BP + 5] = R3 //将R3的值存储于0x25存储单元,变址寻址0x25、单元的

//内容为0x5678

[例3.2]:将0x25,0x26,0x27单元清空

方法1:

R1 = 0 //影响标志位:Z=1,N=0

R2 = 0x25 //立即数0x25送入R2中

[R2++] = R1 //R1的值存储于0x25存储单元,R2=R2 +1

[R2++] = R1 //R1的值存储于0x26存储单元,R2=R2 +1

[R2] = R1 //R1的值存储于0x27存储单元

方法2:

R1 = 0 //影响标志位:Z=1,N=0

R2 =0x27

[R2--] = R1 //R1的值存储于0x27存储单元,R2=R2 - 1

[R2--] = R1 //R1的值存储于0x26存储单元,R2=R2 - 1

[R2] = R1 //R1的值存储于0x25存储单元

方法3:

R1 = 0 //影响标志位:Z=1,N=0

R2 = 0x24 //立即数0x24送入R2中

[++R2] = R1 //R2=R2 +1,R2=0x25,而后R1的值存储于0x25存储单元

[++R2] = R1 //R2=R2 +1,R2=0x26,而后R1的值存储于0x26存储单元

[++R2] = R1 //R2=R2 +1,R2=0x27,而后R1的值存储于0x27存储单元

[例3.3]:用不同方式读取存储器的值。

BP = 0x20 //将立即数0x20赋给BP;

R1 = [BP + 5] //BP + 5=0x25,读取0x25单元数据到R1中

R1 = [0x2345] //读取0x2345单元数据到R1中 R1 = [BP] //读取0x20单元的数据到R1中

R1 = [BP++] //读取0x20单元的数据到R1中,修改BP=0x21 R1 = [BP--] //读取0x21单元的数据到R1中,修改BP=0x20 R1 = [++BP]

//修改BP =0x21,读取0x21单元的数据

数据传送指令一览表

语法

指令长度(word)

响标志

周期数

Rd = IM16 2

6/8 Rd =IM6 3 Rd = [BP +IM6] 8 Rd = [A6] 1 6/8 Rd = [A16] 2

9/11 Rd = Rs 3/8 Rd = [Rs] Rd = [Rs++]

Rd = [++Rs] Rd = [Rs--] N,Z

7/9

[BP + IM6] = Rs 8 [A6] = Rs 1 6/8 [A16] = Rs 2

9/11

[Rd] = Rs [++Rd] = Rs

[Rd--] = Rs [Rd++] = Rs

1

7/9

注:若目的寄存器Rd 为 PC,则指令周期数是列表中的后者,且此时运算后所有标志位均不受影响。

除以上介绍的指令外,堆栈(stack )操作也属于一种特殊的数据传送指下面介绍SPCE061A 的堆栈操作。堆栈指针SP 总是指向栈顶的第一个空项,压入一个字后,SP 减1,将多个寄存器同时压栈总是序号最高的寄存器先入栈,然后依次压入序号较低的寄存器,直到序号最低的寄存器最后入栈。所以,执行指令PUSH R1,R4 TO [SP] 与 指令 PUSH R4,R1 TO [SP]是等效的。因此,在数据出栈前SP 加1,总是先弹

出入栈指令中序号最低的寄存器,而后依次弹出序号较高的寄存器。

【格式】 PUSH

Rx,Ry TO [SP] POP

Rx,Ry FROM [SP]

【说明】Rx,Ry 可以是R1~R4,BP,SP,PC 中的任意两个或一个,执行后将Rx ~Ry 的序列寄存器压栈,或将堆栈中的数据弹入Rx ~Ry 序列寄存器中,压栈操作不影响标志位,出栈操作影响N,Z 标志,当Rx,Ry 中含有SR 时,所有标志位都会改变。压栈、出栈操作的执行周期为3n + 4,若出栈操作的目的寄存器中含有PC 时,执行周期为3n+6。其中n 是压栈数据的个数。压栈和出栈的指令长度均为1字长。 【举例】 PUSH

R1,R5 to [SP] //将R5,R4,R3,R2,R1压栈,参见图3.1 PUSH R2,R2 to [SP] //将R2压栈 PUSH

R3 to [SP]

//将R3压栈

POP R3 from [SP] //R3出栈 POP R2,R2 from [SP] //R2出栈

POP R1,R5 from [SP] //R1,R2,R3,R4,R5出栈

PUSH r1,r5 to [sp]命令执行前

PUSH r1,r5 to [sp] 命令执行后

图3.1 堆栈操作

3.3 算术运算

SPCE061A 单片机的算术运算主要包括加,减,乘以及n 项内积运算。加减运算按是否带进位可分为:不带进位和带进位的加减运算,带进位的加减运算在格式上以及寻址方式与无进位的加减运算类似。这里仍按寻址方式详细介绍不带进位的加减运算,而对带进位的加减运算只作简要说明。

3.3.1 加法运算

加法运算影响标志位:N,Z,S,C 。 ■立即数寻址(不带进位)

【格式1】 Rd += IM6 或 Rd = Rd + IM6 【操作】 R d + IM6 → Rd

【说明】R d 的数据与6位(高位扩展成16位)立即数相加,结果送Rd;

【格式2】 Rd = Rs + IM16 【操作】 R s + IM16 → Rd

【说明】R d 的数据与16位的立即数相加,结果送Rd; 【举例】 假设开始时的标志位为:N=0,Z=1,S=0,C=1

R1=0x0099 //R1的值为0x0099,N=0,Z=0,S=0,C=1 R1+=0x0001 //R1的值变为0x009A ,N=0,Z=0,S=0,C=0 R1+=0xFFFE //R1的值变为0x0098,N=0,Z=0,S=0,C=1 ■直接地址寻址

【格式1】 Rd += [A6] 或 Rd = Rd + [A6] 【操作】 R d + [A6] → Rd

【说明】R d 的数据与6位地址指定的存储单元中的数据相加,结果送Rd 。 【格式2】 Rd = Rs + [A16] 【操作】 R s + [A16] → Rd

【说明】R s 的数据与16位地址指定的存储单元中数据相加,结果送Rd 。 【举例】 假设开始时的标志位为:N=0,Z=1,S=0,C=1

R2=0x0010 //R2的值为0x0010,N=0,Z=0,S=0,C=1

[0x0088]=

R2 //把0x0010送到内存单元0x0088中,标志位不变 R1=

0xF099 //R1的值为0xF099,N=1,Z=0,S=0,C=1 R1+=[0x0088] //R1的值变为0xF0A9,N=1,Z=0,S=1,C=0

■变址寻址

【格式】 R d += [Bp + IM6] 或 Rd = Rd + [BP + IM6] 【操作】Rd + [Bp + IM6] → Rd 【说明】 取基址指针BP 与6位的立即数的和指定的存储单元中的数据与Rd 相加,

结果送Rd 寄存器。

【举例】假设开始时的标志位为:N=0,Z=1,S=0,C=1

R1=0x0010 //R1的值变为0x0010,N=0,Z=0,S=0,C=1 R2=

0x0090 //R2的值变为0x0090,N=0,Z=0,S=0,C=1 [0x0015]=r2 //R2的值送到0x0015内存单元,标志位不变 R1+=[BP+0x0015] //r1的值变为0x00A0,N=0,Z=0,S=0,C=0

■寄存器寻址

【格式】 R d += Rs

【操作】 R d + Rs → Rd

【说明】R d 与Rs 的数据相加,结果送Rd 。

【举例】 假设开始时标志位为:N=0,Z=1,S=0,C=1(注:本例为有符号数计算)

R1=

-8 //R1的值为-8,实际以补码的形式体现。即0xFFF8

//N =1,Z =0,S =0,C =

1

R2=

0xFFFE //r2的值为0xFFFE,N=1,Z=0,S=0,C=1 R1+=

R2 //R1的值变为0XFFF6 ,N=1,Z=0,S=1,C=1,无溢出。

■寄存器间接寻址

【格式1】 Rd += [Rs];

【操作】 Rd + [Rs] → Rd

【说明】R d 的数据与Rs 所指定的存储单元中的数据相加,结果送Rd 【格式2】 Rd += [Rs++]

【操作】 R d + [Rs] → Rd, Rs + 1 → Rs

【说明】R d 的数据与Rs 所指定的存储单元中的数据相加,结果送Rd,修改Rs ,

Rs=Rs+1

【格式3】 Rd += [Rs--];

【操作】 R d + [Rs] → Rd, Rs - 1 → Rs

【说明】 Rd 的数据与Rs 所指定的存储单元中数据相加,结果送Rd, Rs=Rs- 1

【格式4】 Rd += [++Rs]; 【操作】 R s + 1→ Rs, Rd + [Rs] → Rd

【说明】 首先修改Rs=Rs+1,Rd 的数据与Rs 所指定的存储单元中的数据相加,

结果送Rd,

【举例】 假设开始时的标志位为:N=0,Z=1,S=0,C=1

R1=0x0010 //R1的值为0x0010,N=0,Z=0,S=0,C=1 R2=0x0020 //R2的值为0x0020,N=0,Z=0,S=0,C=1

[0x0010]=

r2 //R2的值送到内存单元0x0010中,标志位不变 R2=

0x0010 //R2的值为0x0010

R1+=[R2++] //R1的值变为0x0030,N=0,Z=0,S=0,C=0

//同时R2的值变为0x0011

注意:有符号数的溢出只判断N 和S 两位:N!=S 时溢出,N=S 时无溢出。 3.3.2 减法运算 同不带进位的加法运算一样,不带进位的减法运算同样可分为立即数寻址,直接地址寻址,寄存器寻址,寄存器间接寻址等方式。 减法运算影响标志位:N,Z,S,C 。

■立即数寻址

【格式1】 Rd - = IM6 或 Rd = Rd – IM6 【操作】 Rd – IM6 → Rd

【说明】 Rd 的数据减去6位(bit)立即数,结果送Rd 。 【格式2】 Rd = Rs – IM16 【操作】 Rs – IM16 → Rd

【说明】 Rs 的数据减去16位(bit)立即数,结果送Rd 。 【举例】 假设开始时的标志位为:N=0,Z=1,S=0,C=1 R1=0x0010 //R1的值为0x0010,N=0,Z=0,S=0,C=1

R2=0x0001 // R2的值为0x0001,N=0,Z=0,S=0,C=1

R1-=

R2 // R1的值为0x000F ,N=0,Z=0,S=0,C=1

■直接地址寻址

【格式1】 Rd - = [A6] 或 Rd = Rd – [A16] 【操作】 Rd – [A6] → Rd

【说明】 Rd 的数据减去[A6]存储单元中的数据,结果送Rd 。 【格式2】 Rd = Rs -[A16] 【操作】 Rs – [A16] → Rd

【说明】 Rs 的数据减去[A16]存储单元中的数据,结果送Rd 。 【举例】 假设开始时的标志位为:N=0,Z=1,S=0,C=1

R1=

0x0002 //R1的值为0x0002,N=0,Z=0,S=0,C=1 [0x0020]=R1 //把R1的值送到内存单元0x0020中,标志位不变。 R2=0x0001 //R2的值为0x0001,N=0,Z=0,S=0,C=1 R2-=[0x0020] //R2的值变为0xFFFF ,‘C ’为0,运算过程产生

//借位, N=1,Z=0,S=1

■变址寻址

【格式】 Rd - = [BP + IM6] 或 Rd = Rd – [BP + IM6] 【操作】 Rd – [BP + IM6] → Rd 【说明】 Rd 的值减去基址加变址指定的存储单元的值,结果送Rd 【举例】 假设开始时的标志位为:N=0,Z=1,S=0,C=1 R1=0x8001 //R1的值为0x8001,N=1,Z=0,S=0,C=1

R2=

0x0020 //R2的值为0x0020,N=0,Z=0,S=0,C=1 [0x0010]=R2 //把0x0020送到地址单元0x0010中 R1-=[BP+0x0010] //R1的值变为0x7FE1,N=0,Z=0,S=1,C=1

■寄存器寻址

【格式】 Rd - = Rs 【操作】 Rd – Rs → Rd 【说明】 寄存器Rd 的数据减去Rs 的数据,结果送Rd 寄存器 【举例】 假设开始时的标志位为:N=0,Z=1,S=0,C=1 R1=32767 //R1的初值为0x7FFF,N=0,Z=0,S=0,C=1

R2=32768 //R2的初值为0x8000, ,N=1,Z=0,S=0,C=1 R1-=R2 //R1的值变为0XFFFF,N=1,Z=0,S=0,C=0

■寄存器间接寻址

【格式1】 Rd - = [Rs] 【操作】 Rd -[Rs] → Rd

【说明】 Rd 的数据与Rs 所指定的存储单元中的数据相减,结果送Rd 。 【格式2】 Rd - = [Rs++] 【操作】 Rd - [Rs] → Rd, Rs+1 → Rs

【说明】 Rd 的数据与Rs 所指定的存储单元中的数据相减,结果送Rd, Rs 的

值加1

【格式3】 Rd - = [Rs--] 【操作】 Rd - [Rs] → Rd, Rs –1 → Rs

【说明】 Rd 的数据与Rs 所指定的存储单元中的数据相减,结果送Rd, Rs 的

值减1

【格式4】Rd - = [++Rs]

【操作】Rs + 1 →Rs,Rd - [Rs] → Rd

的值加1,Rd的数据与Rs所指定单元数据相减,结果送Rd 【说明】 Rs

3.3.3 带进位的加减运算

由于带进位的加减运算与不带进位的加减运算在寻址方式,周期数,指令长度,影响的标志位均相同,在格式上相似,故这里只给出格式,供读者参考。

带进位的加法格式

Rd += IM6,Carry

Rd = Rd + IM6,Carry

Rd = Rs + IM16,Carry

Rd += [BP + IM6] ,Carry

Rd = Rd + [BP + IM6] ,Carry

Rd += [A6] ,Carry

Rd = Rd + [A6] ,Carry

Rd = Rs + [A16] ,Carry

Rd += Rs,Carry

Rd += [Rs] ,Carry

Rd += [++Rs] ,Carry

Rd += [Rs--],Carry

Rd += [Rs++],Carry

带进位的减法格式

Rd - = IM6,Carry

Rd = Rd - IM6,Carry

Rd = Rs - IM16,Carry

Rd - = [BP + IM6] ,Carry

Rd = Rd - [BP + IM6] ,Carry

Rd - = [A6] ,Carry

Rd = Rd - [A6] ,Carry

Rd = Rs - [A16] ,Carry

Rd - = Rs,Carry

Rd - = [Rs] ,Carry

Rd - = [++Rs] ,Carry

Rd - = [Rs--],Carry

Rd - = [Rs++],Carry

3.3.4 取补运算

取一个数的补码,在计算机中表示为取其反码,再加1,SPCE061A也正是这样处理的。取补运算影响标志位N,Z。

【举例】计算数- 600与0x0040单元数据的差。

R1 = - 600

R2=0x0001

[0x0040]=R2

BP = 0x0040 //取该单元地址

R2 = -[BP] //取此数的补码,-1的补码为0xFFFF

R1 += R2 //相加,结果送R1

3.3.5 SPCE061A的乘法指令

注:Rd,Rs可用R1~R4,BP;MR由R4、R3构成,R4是高位,R3为低位

【影响标志】无

【格式1】MR = Rd * Rs 或MR = Rd * Rs,ss

【功能】R d * Rs → MR

【说明】表示两个有符号数相乘,结果送MR寄存器

【格式2】MR = Rd * Rs,us

【功能】R d * Rs → MR

【说明】表示无符号数与有符号数相乘,结果送MR寄存器。

【举例】计算一年(365天)共有多少小时,结果存放R4(高位)R3(低位)

R1 =365 //R1的值为0x016D

R2 = 24 //R2的值为0x0018

MR = R1 * R2,us

//计算乘积,结果R3的值为0x2238, R4的值为0x0000 3.3.6 SPCE061A的n项内积运算指令

【影响标志】无

【格式】MR = [Rd] * [Rs] {,ss} {,n}

【功能】指针Rd与Rs所指寄存器地址内有符号数据之间或无符号与有符号字数据之间进行n项内积运算,结果存入MR。符号的缺省选择为ss,即有符号数

据之间的运算。n的取值为1~16,缺省值为1。内积运算操作如图3.2所示。

【执行周期】10n+8

【说明】当FIR_MOV ON时,允许FIR运算过程中数据自由移动。为新样本取代旧样本进行数据移动准备:Xn- 4=Xn- 3,Xn- 3=Xn- 2,Xn- 2=Xn- 1。如上图所示当完成一次内积运算后,X1、X2、X3自动右移,X4移出。这在数字信号处理中十分有用。比如你要计算连续4次采样值的平均值,你即可将采样值放到X1- - - -X4中,加权系数放到C中,然后完成[Rd] * [Rs] {,ss} {,4}运算,再求平均值。当FIR_MOV ON时,运算完后X1、X2、X3自动右移,X4移出,这样我们就可以把下一次的采样值X0放到原X1的位置,下一次直接[完成Rd] * [Rs] {,ss} {,4}运算,即X0-X3

的运算,不必手动移动Xn。

n=1指针指向存储器内

存储器内MR=C1*X1

n=4运算前运算后

指针指向存储器内

存储器内

MR=C1*X1+C2*X2+C3*X3+C4*X4

Rd↓(当FIR_MOV ON)

Rd↓

图3.2 内积运算操作示意图示

注意: (1)Rs 和 Rd 其中任意一个都不能为R3或R4,否则会出错。 (2)Rs 和Rd 不能同为一个寄存器,否则会出错。

下面为一个内积运算的例子。首先在IRAM 中定义8个变量在程序的第一循环阶段,计算的值为2*5+3*6即结果为1C ;第一循环结束后,由于移位的作用,NO_3 的值被NO_2的值取代,变为0x0002,而NO_2的值不变,再次循环后的值为:2*5+3*6结果为0x001C 。该程序比较完整,可在IDE 内操作。在操作的过程中,通过观察IDE 中的变量表可以详细了解程序运行的整个流程。

【举例】 .IRAM

//*******定义8个变量,分别赋初值,NO_7,NO_8为默认值0*********// .VAR NO_1=0x0001,NO_2=0x0002,NO_3=0x0003, NO_4=0x0004 .VAR NO_5=0x0005,NO_6=0x0006 ,NO_7,NO_8 .CODE

.PUBLIC _MAIN; _MAIN :

FIR_MOV ON; //数据自动移动的允许信号 R1=NO_2; //定义起始位 R2=NO_5

MR=[R1]*[R2],us,2 //2项内积运算

[NO_7]=r3 //通过NO_7,NO_8可以读出结果 [NO_8]=r4 NOP

JMP _main //跳转到主程序 RETF

//***************************************************************** //*******************************END*****************************

//*****************************************************************

3.3.7 比较运算(影响标志位N,Z,S,C)

比较运算执行两数的减法操作,不存储运算结果,只影响标志位N、Z、S、C,下面按寻址方式分别介绍比较运算的各条指令。

■立即数寻址

【格式1】CMP Rd,IM6

【说明】将Rd与6位(bit)立即数相减。

【格式2】CMP Rd,IM16

【说明】将Rd与和16位立即数相减。

■直接地址寻址

【格式1】CMP Rd, [A6]

【说明】此指令将Rd的值与A6指定地址单元的数据相减。

【格式2】CMP Rd, [A16]

【说明】此指令将Rd的值与A16指定地址单元的数据相减。

■寄存器寻址

【格式】CMP Rd,Rs

【说明】该指令将Rd与Rs的值相减。

■变址寻址

【格式】C MP Rd,[BP + IM6]

【说明】该指令将Rd与[BP + IM6] 指定地址单元数据相比较。

■寄存器间接寻址

【格式1】 CMP Rd,[Rs]

【说明】将Rd的值与寄存器Rs指定存储单元的数据相比较

【格式2】 CMP Rd,[Rs++]

【说明】将Rd的值与寄存器Rs指定存储单元的数据相比较,并修改Rs的值使Rs的值加1。

【格式3】 CMP Rd,[Rs--]

【说明】将Rd的值与寄存器Rs指定存储单元的数据相比较,并修改Rs的值,使Rs值减1。

【格式4】 CMP Rd,[++Rs]

【说明】修改Rs的值,使Rs加1,将Rd的值与寄存器Rs指定存储单元的数据相比较,结果影响标志位。

3.4 SPCE061A 的逻辑运算

3.4.1 逻辑与

逻辑与运算影响标志位N,Z ■立即数寻址

【格式1】 Rd &= IM6 或 Rd = Rd & IM6 【功能】 R d & IM6 → Rd

【说明】 该指令将Rd 的数据与6位立即数进行逻辑与操作,结果送Rd 寄存器。

【格式2】 Rd = Rs & IM16

【功能】 R s & IM16 → Rd

【说明】 该指令将Rs 的数据与16位立即数进行逻辑与操作,结果送Rd 寄存器。

【举例】 假设开始时的标志位为:N=0,Z=1,S=0,C=1 R1=0x0010 //R1的初值为0x0010,Z=0

R1&=0x000F //结果为0,标志位Z 由0变为1 NOP

■直接地址寻址

【格式1】 Rd &=

[A6] 或 Rd = Rd & [A6] 【功能】 R d & [A6] → Rd

【说明】 将Rd 和A6指定存储单元数据进行逻辑与操作,结果送Rd 寄存器 【格式2】 Rd = Rs & [A16] 【功能】 R s & [A16] → Rd

【说明】R s 中的数据和A16指定存储单元中的数据进行逻辑与操作,结果送Rd 寄存器。

【举例】 假设开始时的标志位为:N=0,Z=1,S=0,C=1

R1=0x0010 //R1赋值为0x0010,Z=0,N=0 R2=0xFFFF //R2赋值为0xFFFF ,Z=0,N=1 [0x000F]=R2

R1&=

[0x000F] //执行后,R1=0x0010,标志位Z=0,N=0

■寄存器寻址

【格式】 R d &= Rs

【功能】 R d & Rs → Rd

【说明】 将Rd 和Rs 的数据进行逻辑与操作,结果送Rd 寄存器。 【举例】 假设开始时的标志位为:N=0,Z=1,S=0,C=1

R1=0x00FF //R1的初值为0x00FF ,Z=0,N=0 R2=0xFFFF //R1的初值为0xFFFF ,Z=0,N=1

R1&=

R2 //结果为0x00FF ,执行后标志位N 变为0,Z=0

■寄存器间接寻址

【格式1】 Rd &= [Rs]

【功能】 R d & [Rs] → Rd

【说明】 将Rd 数据与Rs 指定的存储单元数据进行逻辑与操作结果送Rd 寄存器。

【格式2】 Rd &= [Rs++] 【功能】 R d & [Rs] → Rd ,Rs + 1 → Rs 【说明】 将Rd 的数据与Rs 指定的单元的数据进行逻辑与操作,结果送Rd 寄存器,修改Rs 的值,使Rs 加1。

【格式3】 Rd &= [Rs--]

【功能】 Rd & [Rs] → Rd ,Rs – 1 → Rs 【说明】 将Rd 的数据与Rs 指定的单元的数据进行逻辑与操作,结果送Rd 寄存器,修改Rs 的值,使Rs 减1。

【格式4】 Rd &= [++Rs]

【功能】 R s + 1 → Rs ,Rd & [Rs] → Rd 【说明】 修改Rs 的值,Rs 加1,将Rd 的数据与Rs 指定的单元的数据进行逻辑与操作,结果送Rd 寄存器

【举例】 假设开始时的标志位为:N=0,Z=1,S=0,C=1

R1=

0x00FF //R1的初值为0x00FF ,Z=0,N=0 R2=0xFFFF //R1的初值为0xFFFF ,Z=0,N=1 [0x0001]=R2 R2=0x0001 R1&=[R2] //结果为0x00FF ,执行后标志位N 变为0,Z=0 3.4.2 逻辑或

逻辑或影响标志位N,Z

■立即数寻址

【格式1】 Rd |= IM6 或 Rd = Rd | IM6 【功能】 R d | IM6 → Rd

【说明】 该指令将Rd 的数据与6位立即数进行逻辑或操作,结果送Rd 寄存器。 【格式2】 Rd = Rs | IM16 【功能】 R s | IM16 → Rd

【说明】 该指令将Rs 的数据与16位立即数进行逻辑或操作,结果送Rd 寄存器。

【举例】 假设开始时的标志位为:N=0,Z=1,S=0,C=1

R1=0x00FF //R1的初值为0x00FF ,Z=0,N=0 R1|=0xF000 //R1的值变为0xF0FF, Z=0,N=1

■直接地址寻址

【格式1】 Rd |=

[A6] 或 Rd = Rd | [A6] 【功能】 R d | [A6] → Rd

【说明】 将Rd 和A6指定单元数据进行逻辑或操作,结果送Rd 寄存器 【格式2】 Rd = Rs | [A16] 【功能】 R s | [A16] → Rd

【说明】R s 的数据和A16指定单元数据进行逻辑或操作,结果送Rd 寄存器。

【举例】 假设开始时的标志位为:N=0,Z=1,S=0,C=1

R1=0x00FF //R1的初值为0x00FF ,Z=0,N=0 R1|=[0x0009] //R1值变为0x00FF, Z=0,N=0,[0x0009]的值默认为0。

■寄存器寻址

【格式】 R d |= Rs

【功能】 R d | Rs → Rd

【说明】 将Rd 和Rs 的数据进行逻辑或操作,结果送Rd 寄存器。 【举例】 假设开始时的标志位为:N=0,Z=1,S=0,C=1

R1=

0x0000 //R1的初值为0x0000,Z=1,N=0 R2=0xFFFF R1|=

R2 //R1的值变为0xFFFF, Z=0,N=1

■寄存器间接寻址

【格式1】 Rd |= [Rs] 【功能】 R d | [Rs] → Rd 【说明】 将Rd 的数据与Rs 指定的单元的数据进行逻辑或操作,结果送Rd 寄存器。

【格式2】 Rd |= [Rs++]

【功能】 R d | [Rs] → Rd ,Rs + 1 → Rs

【说明】 将Rd 的数据与Rs 指定的单元的数据进行逻辑或操作,结果送Rd 寄存器,修改Rs 的值,使Rs 加1。

【格式3】 Rd |= [Rs--] 【功能】 R d | [Rs] → Rd ,Rs – 1 → Rs

【说明】 将Rd 的数据与Rs 指定的单元的数据进行逻辑或操作,结果送Rd 寄存器,修改Rs 的值,使Rs 减1。

【格式4】 Rd |= [++Rs]

【功能】 R s + 1 → Rs ,Rd | [Rs] → Rd

【说明】 首先,Rs 的值将加1,Rd 与Rs 指定的单元的数据进行逻辑或操作,结果送Rd 寄存器。

【举例】 假设开始时的标志位为:N=0,Z=1,S=0,C=1

R1=0x0000 //R1的初值为0x0000,Z=1,N=0 R2=0xFFFF //把0xFFFF 送到地址单元[0x0002]中 [0x0002]=R2

R2=0x0002 //R2的值为0x0002 ,Z=0,N=0 R1|=

[R2] //R1的值变为0xFFFF, Z=0,N=1 3.4.3 逻辑异或

逻辑异或影响标志位:N, Z

■立即数寻址

【格式1】 Rd ^= IM6 或 Rd = Rd ^ IM6 【功能】 R d ^ IM6 → Rd

【说明】 指令将Rd 的数据与6位立即数进行逻辑异或操作,结果送Rd 寄存 器。

【格式2】 Rd = Rs ^ IM16 【功能】 R s ^ IM16 → Rd 【说明】 该指令将Rs 的数据与16位立即数进行逻辑异或操作,结果送Rd 寄 存器。

【举例】 假设开始时的标志位为:N=0,Z=1,S=0,C=1

R1=

0x0F00 //R1的初值为0x0F00,Z=0,N=0

R1^=0x0FFF //R1的值变为0x00FF, Z=0,N=0 ■直接地址寻址

【格式1】 Rd ^=

[A6] 或 Rd = Rd ^ [A6]

【功能】 R d ^ [A6] → Rd

【说明】 将Rd 和A6指定存储单元中数据进行逻辑异或操作,结果送Rd 寄 存器

【格式2】 Rd = Rs ^ [A16] 【功能】 R s ^ [A16] → Rd

【说明】R s 的数据和A16指定存储单元中的数据进行逻辑异或操作,结果送Rd

寄存器。

【举例】 假设开始时的标志位为:N=0,Z=1,S=0,C=1 R1=

0x0F00 //R1的初值为0x0F00,Z=0,N=0 R2=0x0FF0 [0x0010]=R2

R1^=

[0x0010] //R1的值变为0x00F0, Z=0,N=0

■寄存器寻址

【格式】 R d ^= Rs

【功能】 R d ^ Rs → Rd

【说明】 将Rd 和Rs 的数据进行逻辑异或操作,结果送Rd 寄存器。 【举例】 假设开始时的标志位为:N=0,Z=1,S=0,C=1

R1=

0x0E01 //R1的初值为0x0E01,Z=0,N=0 R2=0x0FF1 // R2的初值为0x0FF1,Z=0,N=0 R1^=

R2 //R1的值变为0x01F0, Z=0,N=0

■寄存器间接寻址

【格式1】 Rd ^= [Rs]

【功能】 Rd ^ [Rs]→ Rd

【说明】 将Rd 的数据与Rs 指定的存储单元中的数据进行逻辑异或操作,结果送Rd 寄存器。

【格式2】 Rd ^= [Rs++]

【功能】 R d ^ [Rs] → Rd ,Rs + 1 → Rs

【说明】 将Rd 的数据与Rs 指定的存储单元中的数据进行逻辑异或操作,结果送

Rd寄存器,修改Rs,使Rs加1。

【格式3】Rd ^= [Rs--]

【功能】R d ^ [Rs] → Rd,Rs – 1 → Rs

【说明】将Rd的数据与Rs指定的存储单元中的数据进行逻辑异或操作,结果送Rd寄存器,修改Rs,使Rs减1

【格式4】Rd ^= [++Rs]

【功能】R s + 1→Rs ,Rd ^ [Rs] → Rd

【说明】修改Rs,使Rs加1,Rd的数据与Rs指定的存储单元中的数据进行逻辑异或操作,结果送Rd寄存器

【举例】假设开始时的标志位为:N=0,Z=1,S=0,C=1

R1 =0x0000

//R1的初值为0x0000,Z=1,N=0

R2=0xFFFF //R2的初值为0xFFFF,N=1,Z=0

[0x0002]=R2

R2=0x0002

R1^=[R2] //R1的值变为0xFFFF, Z=0,N=1

3.4.4 测试(TEST)

测试指令执行指定两个数的逻辑与操作,但不写入寄存器,结果影响N,Z标志。

■立即数寻址

【格式】T EST Rd,IM6

【说明】该指令将Rd与IM6进行逻辑与操作,不存储结果

【格式】T EST Rd,IM16

【说明】将Rd与IM16进行逻辑与操作,不存储结果,只影响N,Z标志

【举例】假设初始时标志位分别为:N=0,Z=1,S=0,C=1.

R1=0x0E01 //R1的初值为0x0E01,N=0,Z=0,S=0,C=1

TEST R1,0x0000 //测试R1和0x0000相与的结果,N=0,Z=1,S=0,C=1

JZ loop1 //Z为1跳转到loop1处,此时测试结果为0

NOP

NOP

loop1: //标号

R1=0x0000

■直接地址寻址

【格式1】 TEST Rd,

[A6]

【说明】该指令将Rd与A6指定存储单元中的数据进行逻辑与操作,不存储结果,只影响标志N,Z

【格式2】 TEST Rd,

[A16]

【说明】该指令将Rd与A16指定存储单元中的数据进行逻辑与操作,不存储 结果,只影响N,Z标志

【举例】假设初始时标志位分别为:N=0,Z=1,S=0,C=1.

R1=0x0E01 //R1的初值为0x0E01,N=0,Z=0,S=0,C=1

R2=0x0011 //将0x0011送到内存单元[0x0000]中

[0x0000]=R2

TEST R1,[0x0000]

//测试R1和0x0000单元的值相与的结果,此时

//N=0,Z=0,S=0,C=1

JNZ loop1 //Z为0时跳转到loop1处,此时测试结果不为0

NOP

NOP

loop1: //标号

R1=0x0000

■变址寻址

【格式】T EST Rd,[BP+IM6]

【说明】该指令将Rd与BP+IM6指定存储单元中的数据进行逻辑与操作,不存储结果,只影响N,Z标志。

【举例】假设初始时标志位分别为:N=0,Z=1,S=0,C=1.

R1 =0x0E01

//R1的初值为0x0E01,N=0,Z=0,S=0,C=1

R2 =0x0011

//将0x0011送到内存单元[0x0000]中

[0x0000]=R2

TEST R1,[BP+0x0000] //已知BP的值为0

//测试‘R1和BP+0x0000单元的值相与的结果//测试后N=0,Z=0,S=0,C=1

JNZ loop1 //Z不为0时跳转到loop1处,此时测试结果不为0

NOP

NOP

loop1:

R1+=1

■寄存器寻址

【格式】T EST Rd,Rs

【说明】该指令将Rd与Rs的数据进行逻辑与操作,不存储结果,只影响N,Z 标志位。

【举例】假设初始时标志位分别为:N=0,Z=1,S=0,C=1.

R1=0x0000 //r1的初值为0x0000,N=0,Z=1,S=0,C=1

R2=0x1111 //r2的初值为0x1111,N=0,Z=0,S=0,C=1

TEST R1,R2 //测试‘R1和R2的相与的结果’,N=0,Z=1,S=0,C=1

JZ loop1 //‘Z=1’时跳转到loop1处,此时测试结果为0

NOP

loop1: //标号

R1-=1

■寄存器间接寻址

【格式1】 TEST Rd,[Rs]

【说明】该指令将Rd与[Rs] 指定存储单元中的数据进行逻辑与操作,不存储结果,只影响N,Z标志位

【格式2】 TEST Rd ,[Rs++]

【说明】 该指令将Rd 与[Rs] 指定存储单元中的数据进行逻辑与操作,不存储结果,只影响N ,Z 标志位,并且使Rs 值加1。 【格式3】 TEST Rd ,[Rs--]

【说明】 该指令将Rd 与Rs 指定存储单元中的数据进行逻辑与操作,不存储结果,只影响N ,Z 标志位,并且使Rs 值减1。

【格式4】 TEST Rd ,[++Rs]

【说明】 该指令首先使Rs 值加1,而后Rd 与Rs 指定存储单元中的数据进行逻辑 与操作,不存储结果,只影响N ,Z 标志位。

【举例】 假设初始时标志位分别为:N=0,Z=1,S=0,C=1.

R1=0x0000 //R1的初值为0x0000,N=0,Z=1,S=0,C=1

R2=0x1111 //[0x0001]的初值为0x1111,N=0,Z=0,S=0,C=1 [0x0001]=R2

R2=0x0001 TEST R1,R2 //测试‘R1和R2相与的结果’,N=0,Z=1,S=0,C=1 JZ loop1 //‘Z=1’时跳转到loop1处,此时测试结果为0 nop

loop1: //标号 R1=0x0000

……

3.4.5 SPCE061A 的移位操作

SPCE061A 的移位运算包括逻辑左移、逻辑右移、循环左移、循环右移、算术右移等操作,移位的同时还可进行其他运算,如加、减、比较、取负、与、或、异或、测试等。指令长度1,指令周期3/8,影响N,Z 标志。由于硬件原因对于移位操作,每条指令可以移1~4位。

■逻辑左移(LSL )

【格式】R d = Rs LSL n

【说明】 该指令对Rs 进行n (可设为1~4)位逻辑左移,将Rs 高n 位移入SB 寄存器,同时Rs 的低n (1~4)位用0补足,结果送Rd 寄存器。

【举例】 逻辑左移3位。 寄存器移位前的状态为:

RS SB

寄存器移位后的状态为:

Rd SB

程序:

R1=

0xF00F //R1的初值为0xF00F R1=R1 LSL 3 //R1左移3位后的值变为0x8078

第三章指令系统

第5章指令系统 一、判断题 (×)1.执行指令时,指令在内存中的地址存放在指令寄存器中。 (√)2.程序计数器PC用来指示从内存中取指令。 (√)3.同一系列的不同型号的计算机,保持软件向上兼容的特点。 (√)4.在计算机的指令系统中,真正必须的指令数是不多的,其余的指令都是为了提高机器速度和便于编程而引入的。 (×)5.RISC的主要目标是减少指令数,因此允许以增加每条指令的功能的办法来减少指令系统所包含的指令数。 二、选择题 1.在计算机的指令系统中采用不同的寻址方式的主要目的是 C 。 A.实现程序控制和快速查找存储器地址 B.可以直接访问主存和外存 C.缩短指令长度,扩大寻址空间,提高编程的灵活性 D.降低指令的译码难度 2.单操作数指令的操作数由 B 提供。 A.指定寄存器或由操作码指定存储单元 B.由地址码指定的存储单元;如果已标明该存储单元的内容为地址,则由该地址所指定的存储单元 C.由操作码直接指定数据 D.由操作码直接指定的存储单元 3.在多地址指令中,算术运算结果不会存储在 A 中。 A.累加器B.第一地址码所指定的存储空间 C.第二地址码所指定的存储空间D.第三地址码所指定的存储空间 4.把存储单元A的内容传送到存储单元B的指令执行后,存储单元A的内容为 B 。A.空白或零,视机器而定B.与存储单元B的内容相同 C.二进制补码D.存储单元A的内容与存储单元B的内容之差 三、填空题 1.指令操作码通常有两种编码格式:固定格式和可变格式。 2.在当前的计算机中,指令的执行方式有3种,就是顺序执行方式,重叠执行方式和流水线方式。 3.数据传送类指令实现的功能是传送数据,它往往是在主存储器和寄存器之间,或寄存器和寄存器之间传送数据。 4.所谓堆栈,是主存中专门用来存放数据的一个特定的区域,它具有先进后出的性质。 5.Intel 8086/8088的字符串操作指令用来处理存放在存储器中的一串字符或数据。6.内存地址寄存器用来指示从内存中取数据。 7.浮点运算指令对于用于科学计算的计算机是很必要的,可以提高机器的运算速度。四、名词解释 1.计算机指令系统:是指一台计算机上全部指令的集合,也称为计算机的指令集。 2.固定格式:操作码的长度是固定的,集中放在指令字的某一个字段中。 3.可变格式:操作码的长度可变,且分散地放在指令字的不同字段中。 4.寻址:就是寻找操作数的地址,最终目的是寻找所需的操作数。 五、简答题

第三章 MCS-51指令系统习题答案

第三章 MCS -51指令系统 5 题 分析下面程序段的执行功能。 CLR A MOV R2, A MOV R7, #4 LOOP: CLR C MOV A, R0 RLC A MOV R0, A MOV A, R1 RLC A MOV R1, A MOV A, R2 RLC A MOV R2, A DJNZ R7, LO OP SJMP $ 答:将R2:R1:R0所表示的24位二进制数左移4位。(相当×16) 6 题 设系统晶振为12MHZ ,阅读下列程序,分析其功能。 START : SETB P1.0 NEXT: MOV 30H, #10 LOOP2: MOV 31H, #0FAH LOOP1: NOP NOP DJNZ 31H, LOOP1 DJNZ 30H, LOOP2 CPL P1.0 AJMP NEXT SJMP $ 答:((2+1+1)*250+2+2)*10+2=10.042(ms) 在P1.0引脚上输出周期为20ms 的方波。 7 题 阅读下列程序,分析其功能。 MOV R7, #10 MOV A, #30H MOV DPTR, #2000H LOOP : MOVX @DPTR, A INC A INC DPL DJNZ R7, LOOP SJMP $ R2 R1 R0 0 0 0 0

答:在外部数据存储器中的以下地址内存放数据: (2000H)=30H (2001H)=31H (2002H)=32H ┇┇ (2009H)=39H 8 题简述下列程序段完成的功能,程序完成后SP指针应指向哪里? MOV SP, #2FH MOV DPTR, #2000H MOV R7, #50H NEXT: MOVX A, @DPTR PUSH A INC DPL DJNZ R7, NEXT SJMP $ 答:以内部存储器地址30H作为栈底,从30H开始一直到7FH依次存放外部数据存储器中2000H一直到204FH地址中的数据。7FH作为栈顶。程序完成后SP=7FH。 9 题分析下列程序段执行结果,程序执行完后,SP指向哪里? MOV SP, #3FH MOV R0, #40H MOV R7, #10H NEXT: POP A MOV @R0, A DEC R0 DJNZ R7, NEXT SJMP $ 答:将栈中3FH,3EH一直到30H地址中的内容依次放入40H,3FH,…,31H单元中。执行完后SP=2FH。 10 题分析下列程序段执行结果。 XCH A, 30H MOV B, A ANL A, #0FH MOV 33H, A MOV A, B SW AP A ANL A, #15 MOV 34H, A SJMP $ 答:将30H单元中的数的高四位放入34H中,低四位放入33H中。

(完整版)第三章指令系统

第三章指令系统习题参考答案(三) 1、80C51系列单片机的指令系统有何特点? 答:80c51的指令系统的特点有:(1)执行时间短。一个机器周期指令有64条,2个时间周期指令有45条,而4个机器周期指令仅有2条(即乘法和除法指令);(2)指令编码字节少。单字节的指令有49条,双字节的指令有45条,三字节的指令仅有17条;(3)位操作指令丰富。这是80c51单片机面向控制特点的重要保证。 2、80C51单片机有哪几种寻址方式?各寻址方式所对应的寄存器或存储器 空间如何? 答:(1)寄存器寻址。 对应的寄存器有: ·工作寄存器R0~R7 ·累加器A ·寄存器B ·数据指针DPTR (2)直接寻址。 对应的存储空间有: ·片内RAM低128字节(以地址形式表示) ·SFR(以地址形式或SFR符号形式表示,但符号将转换为相应的SFR 地址) (3)寄存器间接寻址。 对应的空间有: ·片内RAM(采用@R0,@R1或SP); ·片外RAM(采用@R0,@R1或@DPTR) (4)变址寻址。 对应的空间有: ·ROM空间(采用@A+DPTR,@A+PC) (5)相对寻址。 ·ROM空间(采用JC rel) (6)位寻址。 ·片内RAM的20H~2FH单元的128可寻址位 ·SFR的可寻址位 3、访问特殊功寄存器SFR可以采用哪些寻址方式? 答:直接寻址、位寻址 4、访问内部RAM单元可以采用哪些寻址方式? 答:寄存器寻址、直接寻址、寄存器间接寻址 5、访问外部RAM单元可以采用哪些寻址方式? 答:寄存器间接寻址 6、访问外部程序存储器可以采用哪些寻址方式? 答:立即寻址、变址寻址、相对寻址 7、为什么说布尔处理功能是80C51单片机的重要特点? 答:布尔处理功能是MCS-51系列单片机的一个重要特征,在物理结构

第三章 80868088的指令系统

3.1 指令的基本格式   一、指令构成 微计算机的指令系统通常由几十种或百余种指令组成(可见表2-1)。每种指令又由两个字段(Field)构成: l.操作码(OP-Code)字段 该字段指示计算机所要执行的操作类型,由一组二进制代码表示,在汇编语言中又用助记将(Mnemonic)代表。8086执行指令时,首先将操作码从指令队列取入执行部件EU中的控制单元,经指令译码器识别后,产生执行本指令操作所需的时序性控制信号,控制计算机完成规定的操作。 2.操作数(Oprand)字段 该字段则是指出指令执行的操作所需的操作数。在操作数字段中,可以是操作数本身,或是操作数地址或是操作数地址的计算方法。微计算机中此字段通常可有一个或两个,称前者为单操作数指令,称后者为双操作数指令。而双操作数又分别称为源操作数src (source)和目的操作数dst(destination)。在指令执行之前,src和dst均为参加运算处理的两个操作数,指令执行之后,在dst中则存放运算处理的结果。 指令的基本格式如下:   二、8086   8086的指令长度可在1~6字节的范围,如图3-1所示。其中B l和B0为基本字节,B3~B6将根据不同指令作相应的安排。   (1)B1字节各字段定义如下: OP--指令操作码。 D--表示方向。D=1寄存器为目的,D=0寄存器为源。 W--表示字节或字处理方式。W=0为字节指令,W=1为字指令。

(2)B2字节各字段定义如下: MOD--给出指令的寻址方式。8086的一条指令中,最多可使用两个操作数,它们不能同时位于存储器中,最多只能有一个是存储器操作数。当MOD=11时为存储器方式,即有一个操作数位于存储器中;MOD=00,没有位移量; MOD01,只有低8位位移量,需将符号扩展8位,形成16位; MOD=10有16位位移量。当MOD=1l时,为寄存器方式,两个操作数均为寄存器。 REG--表示指令中只有一个操作数,这个操作数为寄存器,可见表3-1,表中左部示出寄存器对应的编码。 R/M--R/M受MOD制约。当 MOD=11(即寄存器方式时),由此字段给出指令中第二个操作数所在的寄存器编码;当MOD≠11时,此字段用来指出应如何计算指令中使用的存储器操作数的有效地址。MOD和R /M字段表示的有效地址 EA计算方法如表3-1所示,共2 4种。   (3) B3~B6字节这四个字节一般是给出存储器操作数地址的位移量(即偏移量)和/或立即操作数。位移量可为8位,也可为16位,这由MOD来决定。8086规定16位的字位移量的低位字节放于低地址单元,高位字节放于高地址单元。 若指令中只有8位位移量, 8086在计算有效地址时,自动用符号将其扩展成一个16位的双字节数,以保证有效地址的计算不产生错误,实现正确的寻址。指令中的立即操作数位于位移量的后面。若B3,B4有位移量,立即操作数就位于B5,B6。若指令中无位移量,立即操作数就位于B3,B4字节。总之,指令中缺少的项将由后面存在的项向前顶替,以减少指令长度。 3.2 8086的寻址方式   8086的操作数可隐含在操作码中,也可以是操作数字段中的操作数本身,还可以是存放操作数的地址,如寄存器,I/0端口及存储器。对存储器,给出的或是存储器地址,或是产生存储器地址的信息。从表3

第3章答案指令系统1-40..

第3章指令系统 1,简述下列基本概念:指令,指令系统,机器语言,汇编语言,高级语言。1、指令:CPU根据人的意图来执行某种操作的命令 指令系统:一台计算机所能执行的全部指令集合 机器语言:用二进制编码表示,计算机能直接识别和执行的语言 汇编语言:用助记符、符号和数字来表示指令的程序语言 高级语言:独立于机器的,在编程时不需要对机器结构及其指令系统有深入了解的通用性语言 2,什么是计算机的指令和指令系统? 2、见第1题。 3,简述89C51汇编指令格式。 3、操作码[目的操作数] [,源操作数] 4,简述89C51寻址方式和所能涉及的寻址空间。 5,要访问特殊功能寄存器和片外数据寄存器,应采用哪些寻址方式? 5、SFR:直接寻址,位寻址,寄存器寻址;片外RAM:寄存器间接寻址 6,在89C51片内RAM中,已知(30H)=38H, (38H)=40H, (40H)=48H, (48H)=90H, 请分析下面各是什么指令,说明源操作数的寻址方式以及按顺序执行每条指令后的结果。 6、MOV A,40H ;直接寻址(40H)→A MOV R0,A ;寄存器寻址(A)→R0 MOV P1,#0F0H ;立即数寻址0F0→P1

MOV @R0,30H ;直接寻址(30H)→(R0) MOV DPTR,#3848H ;立即数寻址3848H→DPTR MOV 40H,38H ;直接寻址(38H)→40H MOV R0,30H ;直接寻址(30H)→R0 MOV P0,R0 ;寄存器寻址(R0 )→P0 MOV 18H,#30H ;立即数寻址30H→18H MOV A,@R0 ;寄存器间接寻址((R0)) →A MOV P2,P1 ;直接寻址(P1)→P2 最后结果:(R0)=38H,(A)=40H,(P0)=38H,(P1)=(P2)=0F0H,(DPTR)=3848H,(18H)=30H,(30H)=38H,(38H)=40H,(40H)=40H,(48H)=38H 注意:→左边是内容,右边是单元 7,对89C51片内RAM的高128字节的地址空间寻址要注意什么 7、用直接寻址,位寻址,寄存器寻址 8,指出下列指令的本质区别。 8,MOV A,DATA ;直接寻址2字节1周期 MOV A,#DATA ;立即数寻址2字节1周期 MOV DATA1,DATA2 ;直接寻址3字节2周期 MOV 74H,#78H ;立即数寻址3字节2周期 如果想查某一指令的机器码,字节数或周期数可查阅书本后面的附录A 9,设R0内容为32H, A的内容为48H, 片内RAM的32H单元内容为80H, 40H单元内容为08H, 请指出在执行下列程序段后上述各单元内容的变化。 9、 MOV A,@R0 ;((R0))=80H→A MOV @R0,40H ;(40H)=08H→(R0) MOV 40H,A ;(A)=80→40H MOV R0,#35H ;35H→R0 最后结果:(R0)=35H (A)=80H,(32H)=08H,(40H)=80H 10,如何访问SFR,可使用哪些寻址方式? 10、用直接寻址,位寻址,寄存器寻址 11,如何访问片外RAM,可使用哪些寻址方式? 11、只能采用寄存器间接寻址(用MOVX指令) 12,如何访问片内RAM,可使用哪些寻址方式? 12、低128字节:直接寻址,位寻址,寄存器间接寻址,寄存器寻址(R0~R7) 高128字节:直接寻址,位寻址,寄存器寻址 13,如何访问片内外程序存储器,可使用哪些寻址方式? 13、采用变址寻址(用MOVC指令)

第三章计算机硬件体系结构报告

第三章计算机硬件体系结构 一、填空题 1.地址总线的位数决定了计算机的能力,数据总线的宽度决定了计算机的。2.计算机的运算速度用每秒钟所能执行的______数表示,单位是______。 3.按照总线上传送信息类型的不同,可将总线分为___________、___________、__________三种。 4.在计算机中通常以___________作为单位传送信息的。 5.指令一般包括___________和___________两部分。 6.若一台微机的地址总线位长为32位,则其最大寻址空间为___________。 7.CPU包括________、__________和_______________三个基本部分。 8. 光盘按读写性能可分为___________、___________、__________三种。 二、单项选择题 1. 一个完整的微型计算机硬件系统应由____、存储器、输入设备和输出设备构成。 A. 硬盘 B. ROM和RAM C. CPU D. 显示器 2. 计算机中指令的执行主要由___完成的。 A. 存储器 B. 控制器 C. CPU D. 总线 3. 微型计算机的CPU主要由两部分构成,它们是____。 A. 内存和控制器 B. 内存和外存 C. 运算器和控制器 D. 外存和运算器 4. 磁盘经过高级格式化后,其表面形成多个不同半径的同心圆,这些同心圆称为____。 A. 磁道 B. 扇区 C. 族 D. 磁面 5. 下面有关计算机的叙述中,是正确的。 A. 计算机的主机包括CPU、内存储器和硬盘三部分 B. 计算机程序必须装载到内存中才能执行 C. 计算机必须具有硬盘才能工作 D. 计算机键盘上字母键的排列方式是随机的 6. 计算机的内存储器比辅助存储器_______。 A. 存储更多信息,但存取速度慢 B. 可以存储的信息少,但存取速度快 C. 存储更多信息,且存取速度快 D. 可以存储的信息少,且存取速度慢 7. 计算机的输入输出设备中,处理速度最快的是_____。 A. 软盘 B. 键盘 C. 打印机 D. 硬盘 8. 在计算机中指令主要存放在中。 A. CPU B. 内存 C. 键盘 D. 磁盘 9. 下列有关存储器读写速度的排列,正确的是。 A. RAM>Cache>硬盘>软盘 B. Cache>RAM>硬盘>软盘 C. Cache>硬盘>RAM>软盘 D. RAM>硬盘>软盘>Cache 10. CPU中的可存放少量数据。 A. 存储器 B. 辅助存储器 C. 寄存器 D. 只读存储器

第三章 80868088的指令系统

3.1 指令的基本格式 一、指令构成 微计算机的指令系统通常由几十种或百余种指令组成(可见表2-1)。每种指令又由两个字段(Field)构成: l.操作码(OP-Code)字段 该字段指示计算机所要执行的操作类型,由一组二进制代码表示,在汇编语言中又用助记将(Mnemonic)代表。8086执行指令时,首先将操作码从指令队列取入执行部件EU中的控制单元,经指令译码器识别后,产生执行本指令操作所需的时序性控制信号,控制计算机完成规定的操作。 2.操作数(Oprand)字段 该字段则是指出指令执行的操作所需的操作数。在操作数字段中,可以是操作数本身,或是操作数地址或是操作数地址的计算方法。微计算机中此字段通常可有一个或两个,称前者为单操作数指令,称后者为双操作数指令。而双操作数又分别称为源操作数src (source)和目的操作数dst(destination)。在指令执行之前,src和dst均为参加运算处理的两个操作数,指令执行之后,在dst中则存放运算处理的结果。 指令的基本格式如下: 二、8086 8086的指令长度可在1~6字节的范围,如图3-1所示。其中B l和B0为基本字节,B3~B6将根据不同指令作相应的安排。 表3-1 8086指令格式 (1)B1字节各字段定义如下: OP--指令操作码。 D--表示方向。D=1寄存器为目的,D=0寄存器为源。 W--表示字节或字处理方式。W=0为字节指令,W=1为字指令。 (2)B2字节各字段定义如下: MOD--给出指令的寻址方式。8086的一条指令中,最多可使用两个操作数,它们不能同时位于存储器中,最多只能有一个是存储器操作数。当MOD=11时为存储器方式,即有一个操作数位于存储器中;MOD=00,没有位移量;MOD01,只有低8位位移量,需将符号扩展8位,形成16位;MOD=10有16位位移量。当MOD=1l时,为寄存器方式,两个操作数均为寄存器。 REG--表示指令中只有一个操作数,这个操作数为寄存器,可见表3-1,表中左部示出寄存器对应的编码。

第三章指令系统及寻址方式

第三章指令系统及寻址方式 一、教学内容 1.指令格式 2.指令寻址方式 3.指令系统 二、要求掌握指令的书写格式、指令的寻址方式和每一条指令的作用。 三、重点掌握指令的寻址方式和每一条指令的功能作用。 四、难点在于理解和掌握指令的寻址方式,怎样找到操作数所在存储单元的存放地址以及运用指令编程的技巧等。 五、本章分为4讲,每讲2学时。 第一讲指令寻址方式 1.指令的书写格式 指令有两种书写格式: ?机器指令:由一串二进制数描述 ?符号指令:用英文字母缩写词描述。符号指令的书写格式如下: 标号:操作助记符 [目的操作数][,源操作数];注释 几点说明: 1)标号—表示某一条指令所在存储单元的首址。标号应由字母打头,后跟字母、数字及特殊字符均可,但不能用关键字。 标号的用法: ①标号一般放在子程序(子过程)的第一条指令的开头; ②标号一般放在转移指令要转去的目的地的第一条指令的开头。 ③标号一般放在其他符号定义的前面。 2)指令助记符(操作助记符):MOV;ADD;SUB;END。 3)操作数—有源操作数和目的操作数,他们之间用“,” 分隔。操作数也可有可无。 2.数据寻址方式 一般在指令中包含有操作码和操作数,怎样找到指令中的操作数和操作数所在的地址,这就是寻址方式。

1)立即寻址 操作数直接包含在代码段的指令中。 如: MOV EAX,H MOV BX,6688H MOV AX,1234H ?立即数只能作为源操作数 ?立即寻址主要用来给通用寄存器或存储器赋值 ?不允许给段寄存器直接赋值 2)寄存器寻址 操作数在寄存器中。 32位寄存器:EAX、EBX、ECX、EDX、 ESP、EBP、 ESI、EDI 16位寄存器:AX、BX、CX、DX、SP、BP、SI、 DI、CS、DS、SS、ES、FS、GS 8 位寄存器:AH、AL、BH、BL、 CH、CL、DH、DL 如: MOV AX,BX MOV EDI,ESI MOV AL,CL 3)存储器寻址 操作数在存储器中,其地址由指令以某种方式指出。 ① 16位指令模式下的存储器寻址 16位指令模式寻址结构由4部分组成:段基址×10H+基址+变址+偏移量基址:BX、BP ,变址:SI、DI ,偏移量:8位或16位 如果有效地址在BX,SI或DI中,则以DS寄存器内容为段基址; 如果有效地址在BP中,则以SS段寄存器的内容为段基址。 如果使用段超越(CS:ES:DS:SS:),前缀操作数可以放在冒号前指定的段。例如:MOV ES:[DI],AL MOV ES:2000H, AL

相关主题
文本预览
相关文档 最新文档