MCS-51单片机汇编伪指令

发布者:沭阳小黄同志最新更新时间:2022-12-09 来源: zhihu关键字:MCS-51  单片机  汇编  伪指令 手机看文章 扫描二维码
随时随地手机看文章

汇编语言的特点

1.助记符指令和机器指令一一对应。用汇编语言编制的程序,效率高,占用存贮空间小,运行速度快。因此汇编语言能编写出最优化的程序,而且能反映出计算机的实际运行情况。

2.汇编语言编程比高级语言困难。因为汇编语言是面向计算的,程序设计人员必须对计 算机有相当深入的了解,才能使用汇编语言编制程序。

3.汇编语言能直接和存储器及接口电路打交道,也能申请中断。因此汇编语言程序能直接管理和控制硬件设备。

4.汇编语言缺乏通用性,程序不易移植。各种计算机都有自已的汇编语言,不同计算机的汇编语言之间不能通用。但是掌握了一种计算机的汇编语言,就有助于学习其它计算机的汇编语言。


汇编语言的语句格式

各种汇编语言的语句格式是基本相同的,表示如下:

[标号:] 操作码助记符 [第一操作数] [,第二操作数] [,第三操作数] [;注释]

即一条汇编语句是由标号、操作码、操作数和注释四个都分所组成。其中方括号括起来的是可选择部分,可有可无,视需要而定。


1. 标号

标号是表示指令位置的符号地址,它是以英文字母开始的由1~6个字母或数字组成的字符串,并以“:”结尾。通常在子程序入口或转移指令的目标地址处才赋予标号。有了标号,程序中的其它语句才能访问该语句。MCS-51汇编语言有关标号的规定如下:

1).标号是由1~8个ASCII字符组成,但头一个字符必须是字母,其余字符可以是字母、数字或其它特定字符。

2).不能使用本汇编语言已经定义了的符号作为标号,如指令助记符,伪指令记忆符以及寄存器的符号名称等。

3).标号后边必须跟以冒号。

4).同一标号在一个程序中只能定义一次,不能重复定义。

5).一条语句可以有标号,也可以没有标号,标号的有无决定着本程序中的其它语句是否需要访问这条语句。

2. 操作码

操作码助记符是表示指令操作功能的英文缩写。每条指令都有操作码,它是指令的核心部分。操作码用于规定本语句执行的操作,操作码可为指令的助记符或伪指令的助记符,操作码是汇编指令中唯一不能空缺的部分。

3. 操作数

操作数用于给指令的操作提供数据或地址。在一条指令中,可能没有操作数,也可能只包括一项,也可能包括二项、三项。各操作数之间以逗号分隔,操作码与操作数之间以空格分隔。操作数可以是立即数,如果立即数是二进制数,则最低位之后加“B”;如果立即数是十六进制数,则最低位之后加“H”;如果立即数是十进制数,则数字后面不加任何标记。

操作数可以是本程序中已经定义的标号或标号表达式,例如MOON是一个已经定义的标号,则表达式MOON+1或MOON-1都可以作为地址来使用。操作数也可以是寄存器名。此外,操作数还可以是位符号或表示偏移量的操作数。相对转移指令中的操作数还可使用一个特殊的符号“$”,它表示本相对转移指令所在的地址,例如:JNB TF0,$ 表示当TF0位不为0时,就转移到该指令本身,以达到程序在“原地踏步”等待的目的。

4. 注释

注释不属于语句的功能部分,它只是对每条语句的解释说明,它可使程序的文件编制显得更加清楚,是为了方便阅读程序的一种标注。只要用“;”开头,即表明后面为注释内容,注释的长度不限,一行不够时,可以换行接着书写,但换行时应注意在开头使用“;”号。

5. 分界符(分隔符)

汇编程序在上述每段的开头或末尾使用分隔符把各段分开,以便于区分。分界符可以是空格、冒号、分号和逗号等。这些分界符在MCS-51汇编语言中使用情况如下:

1).冒号(:)用于标号之后。

2).空格 ( )用于操作码和操作数之间。

3).逗号(,)用于操作数之间。

4).分号(;)用于注释之前。

例如MOV A,#0AH表示取一个(立即)数0A(十六进制,如转换成二进制为00001010)传送到A累加器。
所谓机器语言即指令的二进制编码,而汇编语言则是指令的表示符号 。在指令的表达式上也不会直接使用二进制机器码,最常用的是十六进制的形式。


汇编语言:伪指令详解

AT89S51的伪汇编指令

汇编语言除了定义了汇编指令外,还定义了一些汇编伪指令,以支持汇编的运行。伪指令是汇编时不产生机器语言代码的指令,是CPU不能执行的指令,仅提供汇编用的某些控制信息。AT89S51汇编语言常用的伪指令有如下几条。

(1)ORG定位伪指令

格式:ORG m

m一般是16位二进制数,m指出在该指令后的(伪)指令的汇编地址,即生成的机器指令的起始存储器地址。它必须放在每段源程序或数据段的开始行,在一个汇编语言的源程序中允许存在多条定位伪指令,但其中每一个m值都应和前面生成的机器指令存放地址不重叠。

例如下面的代码。

ORG 1000H
START: MOV A,#10H
……
ORG 2000H
SECOND: CLR A

第1条定位伪指令指定了标号START的地址为1000H,“MOV A,#10H”指令及其后面的指令汇编成的机器码放在从1000H开始的存储单元中。

第2条定位伪指令指定了标号SECOND的地址为2000H。从START开始的程序段所占用的存储地址最多为1FFFH,否则与从SECOND开始的程序段地址重叠,程序在编译时不会发生错误,但在运行时就会发生错误。

(2)DB定义字节伪指令

格式:标号:DB X1,X2,…,Xn

标号可有可无,Xi是单字节数据,它可为十进制数或十六进制数,可以为一个表达式,也可以是在括在引号‘’中的字符串,表示ASCII码的字符,两个数据之间用逗号“,”分开。它通知汇编程序从当前ROM地址开始,保留存储单元,并存入DB后面的数据。

例如下面的代码。

ORG 1000H
DB 0AAH
SDATA: DB 25,25H

经汇编后,从地址1000H处的存储器的内容如下:

(1000H)=AAH
(1001H)=19H
(1002H)=25H

(3)DW定义字伪指令

格式:标号:DW Y1,Y2,…,Yn

标号可有可无,Yi是双字节数据,它可为十进制数或十六进制数,可以为一个表达式,两个数据之间用逗号“,”分开。

它通知汇编程序从当前ROM地址开始,保留存储单元,并存入DW后面的数据。存放时高8位在前,低8位在后,如下所示。

ORG 1000H
DW 1234H
DW 2000

经汇编后,从地址1000H处的存储器的内容如下:

(1000H)=12H
(1001H)=34H
(1002H)=07H
(1003H)=D0H

(4)EQU赋值伪指令

格式:字符名称 EQU 项(数或汇编符号)

EQU伪指令是把“项”赋给“字符名称”,需要注意的是,这里的字符名称不同于标号(其后面没有冒号),但它是必需的,其中的项可以是数也可以是汇编符号。

用EQU赋过值的符号名称必须先定义后使用,这些被定义的字符名称可以用做数据地址、代码地址、位地址或一个立即数。因此它可以是8位的,也可以是16位的。

例如下面的代码。

AA EQU R1
MOV A, AA

这里AA就代表了工作寄存器R1。

(5)DATA数据地址赋值命令

格式:字符名称 DATA 数据或表达式

此命令把数据地址或代码地址赋予标号段规定的字符名称。被定义的字符名称也可以先使用后定义。

例如下面的代码。

ORG 8000H
INDEXJ DATA 8096H
LJMP INDEXJ

等价于如下代码。

ORG 8000H
LJMP 8096H

DATA和EQU的区别在于用DATA定义的字符名称作为标号登记在符号表中,故可先使用后定义;而用EQU定义的字符名称必须先定义后使用,其原因是EQU不定义在符号表中。

(6)DS定义存储空间伪指令

在汇编时,从指令地址开始保留DS之后表达式的值所规定的存储单元。

例如下面的代码。

ORG 1000H
DS 07H
DB 20H, 20
DW 12H

经汇编后,从地址1000H开始保留7个单元,然后从1007H处存储器的内容如下:

(1007H)=20H
(1008H)=14H
(1009H)=00H
(100AH)=12H

DB、DW、DS伪指令都只对程序存储器起作用,它们不能对数据存储器进行初始化。

(7)BIT定义位符号伪指令

格式:字符名称 BIT 位地址

这里的字符名称与标号不同,但它是必需的,其功能是把BIT之后的位地址赋给字符名称。

例如下面的代码。

P11 BIT P1.1

这样,P1口的位1地址91H就赋给了P1.1。

(8)END汇编结束伪指令

END伪指令通知汇编程序结束汇编,在END之后即使还有指令,汇编程序也不做处理。在程序中可以有多条END指令,一般在程序的最后需要一条END伪指令,否则汇编程序会提示警告错误。当然这不会影响程序的正常执行。

这组伪指令是用的比较多的,你可以简单理解为 if.........else语句,成立则运行,这里的成立就是编译响应的代码。

如果你学会了使用这些伪指令相信你在编程中会更加简洁,调试维护程序也很方便。


关键字:MCS-51  单片机  汇编  伪指令 引用地址:MCS-51单片机汇编伪指令

上一篇:MCS-51 单片机的中断系统
下一篇:MCS-51单片机指令系统(4)

推荐阅读最新更新时间:2024-11-10 10:18

51单片机lcd代码
#include ../delay/delay.h #include lcd.h /*==================================================== 判断写入命令/数据函数 =====================================================*/ void lcd_write(unsigned char byte, unsigned char flag) { if(flag) { RS = 1; //选择数据寄存器 } else {
[单片机]
关于stm32单片机,用id加密,明码安全问题分析
stm32 提供的 id ,可以让我们进行软件加密, 这个功能挺好的, 但是我研究了一下明码加密的弱点, 贴出来,给大家研究一下, 写了一段简单的代码,如下,效验id 程序就是输出 ok1, 来代表id的明码对比, 然后我们生成hex文件, 这个hex文件,就是我们明码加密后的烧写文件, 当这个文件烧写到指定的id 设备上,才能运行 ,我们测试是 输出ok1; 加密过程已经ok, 下面 我们分析一下弱点, 单片机声明的常量, 编译器会进行编译,并固化到flash区域, 基本上大多数单片机编译器都是这么做的, 所以
[单片机]
关于stm32<font color='red'>单片机</font>,用id加密,明码安全问题分析
单片机环境的搭建-1.4点亮一个LED
1.4 点亮一个LED 在本教程中,我们使用最常见的STC89C52RC-DIP40单片机作为主控芯片,这也是很多初学者入门的单片机。IDE采用Keil软件,该软件自带编译器,然后通过烧写器将指令下载到单片机。 1.4.1 新建一个keil工程 (1) 双击keil软件 (2) 点击project- New uvision Project, 选择保存路径,取一个工程名字LED (3) 在CPU中选择Atmel,找到并选择AT89C52,点击确定 接下来弹出一个对话框,选择 否 (5) 点击 创建一个空白文件 或者使用ctrl+N(File下面的那个图标) ​然后点击保存(ctrl
[单片机]
<font color='red'>单片机</font>环境的搭建-1.4点亮一个LED
51单片机学习:DS18B20温度传感器实验
实验名称:DS18B20温度传感器实验 接线说明: 实验现象:下载程序后,插上DS18B20温度传感器,数码管显示检测的温度值 注意事项:注意温度传感器的方向,在接口处我们已经用丝印画了一个凸起, 所以只需要将温度传感器对应插入即可 ***************************************************************************************/ #include public.h #include smg.h #include ds18b20.h /***********************************************************
[单片机]
MCS-51单片机内部结构及功能简介
1.结构   (1)中央处理单元(8位) 数据处理、测试位,置位,复位 位操作   内容来自单片机之家www.dpj100.com (2)只读存储器(4KB或8KB)   永久性存储应用程序,掩模ROM、EPROM、EEPROM (3)随机存取内存(128B、128B SFR) 在程序运行时存储工作变量和资料 内容来自单片机之家www.dpj100.com (4)并行输入/输出口(I / O)(32条) 作系统总线、扩展外存、I / O接口芯片 (5)串行输入/输出口(2条)   串行通信、扩展I / O接口芯片 内容来自单片机之家www.dpj100.com (6)定时/计数器
[单片机]
89C52单片机 蜂鸣器的实现
1、简介 开发板蜂鸣器电路 我们可以看到 蜂鸣器是连接开发板 P2.3口, 并且通过三极管来控制蜂鸣器供电电路的连接和断开。 2、实现代码 #include reg52.h //引入51头文件 sbit beep = P2^3; //得到控制蜂鸣器的端口值,默认 为高电平 1 //毫秒延时函数 void delay(int time){ int x,y; for(x = time;x 0;x--) for(y = 114;y 0;y--); } void main() { while(1) { //beep = 0; //蜂鸣器一直响 beep = ~beep; //按位取反 1
[单片机]
89C52<font color='red'>单片机</font> 蜂鸣器的实现
51单片机I2C 24c02 1-99秒循环定时器
51单片机,I2C 24c02 1-99秒循环定时器 仿真电路。 程序源码 HEX文件 单片机源程序如下: #include reg52.h #include i2c.h #ifndef uchar #define uchar unsigned char #endif #ifndef uint #define uint unsigned int #endif #ifndef ulong #define ulong unsigned long #endif uchar stoptime=0,runtime=0,stopcoun=00,runcoun=00; uchar di
[单片机]
51<font color='red'>单片机</font>I2C 24c02 1-99秒循环定时器
从硬件和软件的角度分析ARM和单片机的不同
对于新手来说,在入门阶段针对ARM与单片机进行区分是非常困难的。两者在一些概念和用途上高度接近,这就使得刚入门的开发者无法十分准确的对两者进行区分。本文将从软件和硬件两个大方面来对ARM和单片机的不同进行区分。 软件 这应该是最大的区别了,引入的操作系统为两者进行了区别划分。 1)方便。主要体现在后期的开发,即在操作系统上直接开发应用程序。不像单片机一样一切都要重新写。前期的操作系统移植工作,还是要专业人士来做。 2)安全。这是LINUX的一个特点。LINUX的内核与用户空间的内存管理分开,不会因为用户的单个程序错误而引起系统死掉。这在单片机的软件开发中没见到过。 3)高效。引入进程的管理调度系统,使系统运行更加高效。在传统的
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
    做任何事情之前,一定要想好目标。没有目标的事情是做不好的,也做不成。我的目标就是学习ARM开发,当然是深入的学习。目标如下 :1、学习A ...
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
  • 学习ARM开发(7)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved