【微机原理】-指令系统与程序设计

指令是让计算机完成某种操作的命令。指令可用英文单词缩写表示,称为助记符。

指令的格式与寻址方式

指令的格式

任何一种汇编语言的指令语句都是与机器指令一一对应的,汇编程序将指令语句翻译成机器指令代码,然后让机器执行

一般格式为:

标号: 指令助记符 目的操作数 源操作数;注释

寻址方式

基本的寻址方式有6种:立即数寻址、直接寻址、寄存器寻址、寄存器间接寻址、变址寻址以及基地加变址寻址。在MCS-51中还有特有的寻址方式:位寻址

1.立即数寻址 所需数据在指令中直接给出,这种方式叫立即数寻址方式。

例如: MOV DPTR, #16H; DPTR ← 16H

2.直接寻址 在指令中直接给出操作数的地址就叫直接寻址。

例如: MOV A, 30H; A ← (30H)

如果指令中没有指明段,则默认为数据段。

3.寄存器寻址 操作数在寄存器中,这种寻址方式就是寄存器寻址

例如: MOV A, R0; A←R0 将R0寄存器的内容送到累加器A中

4.寄存器间接寻址 指令中将某一个寄存器的内容作为操作数的地址,这种寻找操作数的方式称为寄存器间接寻址

例如: MOV A , @R0; A←(R0)

MOVX 表示与外部RAM传送数据

5.变址寻址 以源变址寄存器或目的变址寄存器的内容为地址偏移量即变址,然后将变址加上基本地址才是最终的操作数地址

6.相对地址 相对地址方式只出现在相对转移指令中。在相对地址转移指令中,采用相对寻址方式,此时指令的操作数部分给出的是地址的相对偏移量。以当前PC值再加上指令中规定的偏移量而构成十级的转移地址。

所在的地址称为源地址,转以后的地址称为目的地址。

7.位寻址

(1)直接采用00H~0FFH范围的某一位的位地址来表示

(2)采用第几单元的第几位方法

(3)对于特殊功能寄存器,可以直接使用寄存器名加位数的表示法。

MCS-51的指令系统

数据传送指令

1.基本传送指令

MOV指令是形式最简单、用得最多的指令,它可以实现CPU内部数据之间的数据传送、寄存器和内存之间的数据传送,还可以把一个立即数送给CPU的寄存器或者内存单元。

(1)目的操作数不允许为立即数;

(2)除源操作数为立即数的情况外,两个操作数中必有一个是寄存器;

(3)不允许在两个内存单元之间或者两个段寄存器之间直接传送数据;

(4)MOV指令不影响标志寄存器中的标志位。

2.堆栈操作指令

堆栈是以先进后出方式工作的存储区。在程序调用和中断处理过程时,分表要保存返回地址和断点地址;在进入子程序和中断处理后,还需要保留通用寄存器的值;子程序返回和中断处理返回时,则要恢复通用寄存器的值,并分别将返回地址或断点地址恢复到指令指针寄存器中。

PUSH是把字压入栈,POP是把字弹出栈。

SP的内容任何时候都指向当前的栈顶。

3.交换指令

MCS-51系统中,只能和累加器A进行字节交换

XCH A,Rn;

算数运算类指令

1、加法指令

(1)普通加法 ADD 目的操作数 源操作数

(2)带进位的加法 ADDC 目的操作数 源操作数

(3)加一指令 INC 操作数;

2、减法指令

在MCS-51系统中,只有带借位的减法指令,没有不带借位的减法指令

在第一次使用SUBB钱,要首先将CY清零。CLR C

(1)借位减法指令 SUBB 目的操作数 源操作数

(2)减1指令 DEC 操作数

3、乘法指令

(1)MUL 无符号乘法指令

MUL AB

本指令将累加器A和寄存器B中两个8位无符号数相乘,16位积的低8位存于A,高8位存于B中,进位标志总是清零。

4、除法指令

(2)DIB AB

被除数存于A中,除数存于B中,相除之后,商存于累加器A,余数存于累加器B中,清零CY和OV标志(只有除数为0,才会置为OV)

5、十进制调整指令(BCD码调整)

在MCS-51系统中,BCD码加法的调整指令为

DA A

逻辑操作类指令

1.逻辑与

ANL 目的操作数, 源操作数

对目的操作数与源操作数按位与运算

2.逻辑或

ORL 目的操作数, 源操作数

对目的操作数与源操作数按位或

3.逻辑疑惑

XRL 目的操作数,源操作数

4.逻辑求反

CPL A;将A诸位求反


CLR A;将A清零

RL A;各位一次左移,并将最高位移动至最低位

RLC A; 带进位的循环左移

RR A;各位依次右移,并将最低位移动至最高位

RRC A;带进位的循环右移指令

程序控制类指令

1.转移指令

(1)无条件转移指令

LJMP addr16;长转移指令

AJMP addr11;短跳转移指令 先将PC内容加2,PC高5位与11位地址addr11拼装成16位绝对地址。

SJMP rel;短跳转指令。

JMP @A + DPTR;间接跳转指令,

(2)条件转移指令

①累加器判零跳转指令

JZ rel;当A全0,则跳转至PC+2+rel

JNZ rel;当A不是全0,则跳转至PC+2+rel

②比较条件转移指令

CJNE 比较值1,比较值2,跳转偏移量

③减一条件转移指令

DJNZ Rn,rel;

2.调用和返回指令

(1)调用指令

①短调用指令

ACALL addr11

②长调用指令

LCALL addr16

(2)返回指令 RET

布尔位操作指令

MCS-51系统在硬件上有一个布尔处理器。

1、位传送指令

MOV C,bit

MOV bit,C

2、位清零以及位置位指令

CLR bit;清零

SETB bit;置位

3、位运算指令

ANL ORL CPL

4、位控制转移指令

(1)以CY内容为条件的转移指令

JC rel

JNC rel

JB bit,rel

JNB bit,rel

JBC bit,rel ;若bit=1;则跳转,且bit置0,否则执行下一指令

MCS-51的伪指令

由汇编语言编写的源程序要经过汇编程序汇编,生成目标文件即.obj文件,再经过连接,生成可执行文件,即.exe文件才能运行程序。

汇编语言程序的语句除指令以外还有专供汇编的伪指令和宏指令。伪指令不是在程序运行期间由计算机来执行的,它是在汇编程序对源程序汇编期间由汇编程序处理的操作,它们可以完成如数据定义、分配存储区、指示程序结束等功能。

(1)ORG(启始汇编)伪指令

用来指定汇编程序对源程序开始进行汇编

(2)END(结束汇编)伪指令

常用语汇编语言程序末尾,用来指示源程序到此全部结束

(3)EQU(赋值)伪指令

用于给它左边的“字符名称”赋值。

(4)DATA(数据地址赋值)伪指令

DATA伪指令称为数据地址赋值伪指令,也用来给它左侧“字符名称”赋值。

(5)DB伪指令

定义字节伪指令,可以用来为汇编程序在内存的某个区域中定义一个或者一串字节。

(6)DW伪指令

定义字伪指令,用来为汇编程序在内存的某个区域中定义一个或者一串字。

DW的作用于DB基本相同,不同之处是DW的表达式计算出的是16位字长的值,低8位存储在标号只是的单元地址中,高8位存储在标号加一的地址单元中。

(7)DS伪指令

称为定义存储空间伪指令

可以指示汇编程序从它的标号地址开始预留一定数量的内存单元,以备源程序执行过程中使用。

(8)BIT伪指令

BIT(位地址赋值)伪指令称为位地址赋值伪指令,用于给以符号形式的位地址赋值

汇编语言程序设计步骤与结构

汇编语言程序设计要经历建立模型、确定算法、编制流程、分配内存、编写程序、上机调试

程序的基本结构有三种:顺序、分支、循环

子程序与运算程序设计

1.子程序设计需要注意的问题

(1)子程序要利用过程定义伪指令声明,获得子程序名和调用属性。

(2)子程序最后利用RET指令返回主程序,主程序执行CALL指令调用子程序

(3)子程序中对堆栈的压入和弹出操作要成对使用,保持堆栈平衡

主程序CALL指令将返回地址压入堆栈,子程序RET指令将返回地址弹出堆栈。

(4)子程序开始应该保护用到的寄存器内容,子程序返回前进行相应恢复。

(5)子程序应安排在代码段的主程序之外,最好放在主程序执行终止后的位置,也可以放在主程序开始执行之前的位置。

(6)子程序允许嵌套和递归

(7)子程序可以与主程序共用一个数据段,也可以使用不同的数据段

(8)子程序的编写可以很灵活,例如具有多个出口和入口,但一定要保证堆栈操作的正确性

(9)处理好子程序与主程序间的参数传递问题。

(10)提供必要的子程序说明信息

2.子程序参数的传递方法

(1)采用寄存器传递参数

(2)利用寄存器传送子程序参数的地址

(3)利用堆栈传送子程序参数

(4)利用位地址传送子程序参数


我们可以将子程序单独编写成一个源程序文件,经过汇编之后形成目标模块OBJ文件,这就是子程序模块。子程序模块让库管理程序LIB.EXE统一管理,作为库中的一部分,就形成了子程序库。

(1)子程序文件中的子程序名、定义的共享变量名要声明以便为其他程序使用。

(2)子程序必须在代码段中,但没有主程序那样的开始执行和结束执行点

(3)如果采用简化段源程序格式,子程序文件的存储模式要与主程序文件保持一致。

(4)子程序与主程序之间的参数传递仍然是一个难点。

宏汇编

宏是具有宏名的一段汇编语言序列。

与伪指令主要指示如何汇编不同,宏指令实际上是一段代码序列的缩写,在汇编时,汇编程序用对应的代码序列代替宏指令。

宏定义

宏名 MACRO[形参表]

...

ENDM

宏调用

宏定义之后就可以使用它

宏名[实参表]

宏像子程序一样可以简化源程序的书写,但是他们有本质区别:

宏调用在汇编时将相应的宏定义语句复制到宏指令的位置,执行时不存在控制的转移与返回

子程序调用在执行时由主程序的调用CALL指令实现,控制转移到子程序,子程序需要执行返回RET指令将控制再转移到主程序。

局部标号

当宏定义具有分支、循环等程序结构时,需要标号。宏定义体重的标号必须用LOCAL伪指令声明为局部标号,否则多次宏调用将出现标号的重复定义语法错误。

LOCAL 标号列表

宏定义中可以有宏调用,只要遵循先定义后调用的原则即可;宏定义中还可以具有子程序调用;子程序中也可以进行宏调用,只要实现有宏定义即可。

文件包含

运用伪指令INCLUDE将多个源程序合为一体。

利用INCLUDE伪指令包含其他文件,其实质仍然是一个源程序,只不过是分成了几个文件书写;被包含的文件不能独立汇编,而是依附主程序而存在的。所以,合并的源程序之间的各种标识符应该统一规定,不能发生冲突。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值