汇编语言(STC89C52)

news2024/10/4 23:40:24

 指令是计算机计算CPU根据人的意图来执行某种操作的命令。一台计算机所执行的全部指令的集合,称为这个CPU的指令系统。而想要使计算机按照人们的要求完成一项工作,就必须让CPU按顺序执行预设的操作,即逐条执行人们编写的指令。这种按照人民要求所编排的序列,称为程序。编写程序的过程叫做程序设计。程序时机语言就是编写程序的一整套规则和方法,是实现人机交互的工具,分为机器语言、汇编语言和高级语言。我们本篇要了解的就是汇编语言。

汇编语言是用助记符、符号和数字等来表示指令的程序语言,相对于机器语言来说,汇编语言容易理解和记忆。接下来让我们一起来学习一下汇编语言格式的基础知识吧。

汇编语言格式

MCS-51汇编语言指令由4部分组成,其一般格式如下:

[标号:]       操作码      [操作数]      [;注释]

格式中的方括号表示可以没有相应部分,可见,可以没有标号、操作数和注释,但至少要有操作码

其操作数最多可以是3项:

[操作数1]   [,操作数2]   [,操作数3]

操作数1常称为目的操作数,操作数2称为源操作数,操作数3多为跳转的目标。

例如:START : MOV       A,#23     ;23H→A

这里“START”为标号,“MOV”是操作码,“A,#23H”是操作数,“23H→A”为注释。

标号是相应指令的标记,便于查找,用于程序入口、循环等。

操作码规定了指令所要执行的操作,由2~5个英文字母表示。例如:MOX,ADD,RRC,JZ等。

操作数指出参与操作的数据来源、操作结果存放的地方以及跳转的目标位置。(操作数可以是一个数(立即数),也可以是数据所在的空间地址,即在执行指令时从指定的空间地址读取或写入数据)

注释主要使程序容易阅读。

上面一堆话看着头大:总结一下就是汇编指令由四个部分:标号、操作码、操作数和注释;操作数是必有的;一般都是操作码和操作数(有时候还会有注释)(例如:MOV A)

操作码和操作数都有对应的二进制代码,指令代码由若干字节组成;根据字节数不同分为:

单字节指令、双字节指令、三字节指令。

1.单字节指令

(1)指令码中隐含着对某个寄存器的操作

例如:"INC A","MUL AB"等指令,只需要一个8个二进制代码就能表示出执行什么操作、操作数是哪个。

比如数据指针增加1指令“INC DPTR”,其二进制指令代码是A3H,格式如下:


                            1            0          1           0           0            0            1            1


(2) 由指令码中的 r  r  r 或 i 指定操作数。

如累加器A向工作寄存器传送数据指令“MOV  Rn,A”,其指令格式为:


                            1            1          1           1           1             r           r            r


 2.双字节指令

用1B表示操作码,另1B表示操作数或操作数所在的地址。

其指令格式:


                 操作码                 立即数或地址


MSC-51共有45条双字节指令。

3.三字节指令

用1B表示操作码,另外2B表示操作数或操作数所在的地址。

其指令格式: 


                  操作码                 立即数或地址              立即数或地址


 上面部分不是很理解的同学不用着急,可以再看一遍熟悉一下,后面多看一些指令会帮助理解一些。接下来我们讲一下寻址方式。

寻址方式

所谓寻址方式,是值CPU寻找参与运算的操作数的方式,或者寻找数据保存位置的方式。这一部分非常重要,大家要认真学习哦。里面的举例如果看不懂的同学先不急,后面会讲到指令系统分类,可以先大致了解一下了之后看最后一部分,然后再回来看这部分的例子哦。

立即寻址

立即寻址也称立即数,它是在指令操作数中直接给出参加运算的操作数,其指令格式如
下:
如:    MOV   A ,  #70H  ;
这条指令的功能是将立即数70H传送到累加器A中。

直接寻址

在直接寻址方式中,指令操作数域给出的是参加运算操作数地址。直接寻址方式只能用来表示特殊功能寄存器、内部数据寄存器和位地址空间。其中特殊功能寄存器和位地址空间只能用直接寻址方式访问。
如:      ANL  70H ,   #48H
表示70H单元中的数与立即数48H相“与”,结果存放在70H单元中。其中70H为直接地
址,表示内部数据存储器RAM中的一个单元。

间接寻址

间接寻址采用R0或R1前添加“@”符号来表示。

例如,假设R1中的数据是40H,内部数据存储器40H单元所包含的数据为55H,那么如下指令:
    MOV        A,  @R1
把数据55H传送到累加器。

寄存器寻址

寄存器寻址是对选定的工作寄存器R7~RO、累加器A、通用寄存器B、地址寄存器和进位C中的数进行操作。其中寄存器R7~RO由指令码的低3位表示,ACC、B、DPTR及进位位C隐含在指令码中。因此,寄存器寻址也包含一种隐含寻址方式。
寄存器工作区的选择由程序状态字寄存器PSW中的RS1、RSO来决定。指令操作数指定的寄存器均指当前工作区中的寄存器。
如:      INC    R0     ;(R0)+1→>R0

表1 低3位操作码与寄存器Rn的关系

低3位r  r  r000001010011100101110111
寄存器RnR0R1R2R3R4R5R6R7

指令寻址

绝对寻址

绝对寻址是在指令的操作数中,直接提供目标位置的地址或地址的一部分。

例如:LJMP   SER_INT_T1    ;无条件跳转到T1中断服务程序SER_INT_T1   

相对寻址

相对寻址是将程序计数器PC中的当前值与指令第二字节给出的数相加,其结果作为转移指令的转移地址。转移地址也称为转移目的地址,PC中的当前值称为基地址,指令第二字节给出的数称为偏移量。由于目的地址是相对于PC中的基地址而言,所以这种寻址方式称为相对寻址。偏移量为带符号的数,所能表示的范围为+127 ~-128。这种寻址方式主要用于转移指令。
如:   JC     80H    ;C=1 跳转
表示若进位位C为0,则程序计数器PC中的内容不改变,即不转移。若进位位C为1,则以PC
中的当前值为基地址,加上偏移量80H后所得到的结果作为该转移指令的目的地址。

变址寻址

在变址寻址方式中,指令操作数指定一个存放变址基值的变址寄存器。变址寻址时,偏移量与变址基值相加,其结果作为操作数的地址。变址寄存器有程序计数器PC和地址寄存器DPTR
如:   MOVC     A, @A+DPTR
表示累加器A为偏移量寄存器,其内容与地址寄存器DPTR中的内容相加,其结果作为操作数的地址,取出该单元中的数送入累加器A。

位寻址

位寻址是指对一些内部数据存储器RAM和特殊功能寄存器进行位操作时的寻址。在进行位操作时,借助于进位位C作为位操作累加器,指令操作数直接给出该位的地址,然后根据操作码的性质对该位进行位操作。位地址与字节直接寻址中的字节地址形式完全一样,主要由操作码加以区分,使用时应注意。
如:    MOV          C, 20H     ;  片内位单元位操作型指令

以上是7种寻址方式

总结一下:

寻址方式操作数寻址空间及范围示例指令
立即数寻址在程序存储空间,随指令读出MOV  A,#46H
直接寻址片内RAM种,低128B和SFRMOV  A,46H
间接寻址

片内RAM:使用@Ri、SP;

范围为256B,不含SFR

片外RAM:使用@Ri、@DPTR;

范围为64KB

MOV      A,@R0

MOVX  @DPTR,A

寄存器寻址使用R0~R7、A、B、C、DPTRMOV  A ,R2
相对寻址操作数是相对地址;在程序存储空间;范围-128~127STMP   LOOP
绝对寻址操作数是目标地址;在程序存储空间;范围为64KB全空间LJMP  SECON
变址寻址

使用@A+PC、@A+DPTR;在程序存储器中;

范围分别在PC之后256B之内和64KB全空间

MOVC  A,@A+DPTR

MOVC  A,@A+PC

位寻址使用位地址;在位寻址空间;范围-128~127SJMP    LOOP

指令中常用符号注释 

Rn:n=0~7,工作寄存器R0~R7。

Ri:i=0、1。可作为地址指针的R0和R1。

#data:8位立即数

#data16:16为立即数

direct:8位片内RAM单元地址

addr16:程序存储空间的16位目的地址,用于LCALL和LJMP指令中

rel:补码形式的8位地址偏移量。

bit:片内RAM或SFR中的直接寻址位地址。

@:间接寻址方式的前缀符号。

(×):表示×中的内容。(地址)

((×)):表示由×中指向的地址单元的内容。(数据)

^:逻辑与

(与逻辑与的形状一样,开口方向相反(键盘没找到那个符号)):逻辑或

→:指令操作流程,将内容送到箭头指向的地方

指令系统分类

数据传送类指令

算术运算指令


逻辑操作类指令


控制转移类指令


布尔变量操作类指令

欢迎大家指出问题!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1689313.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

暴雨信息液冷计算解决方案亮相CCIG 2024

5月24日,2024中国图象图形大会(CCIG)在陕西西安正式开幕。作为涵盖图像图形各专业领域的综合性的全国性学术会议,CCIG面向开放创新、交叉融合的发展趋势,为图像图形相关领域的专家学者和产业界的同仁,搭建了…

本是梦中人,常作花下客。心中自往来,知我有几个。

我们总是喜欢拿“顺其自然”来敷衍人生道路上的荆棘坎坷,却很少承认,真正的顺其自然, 其实是竭尽所能之后的不强求, 而非两手一摊的不作为。 一花凋零荒芜不了整个春天, 一次挫折也荒废不了整个人生。 多年后&#x…

头歌openGauss-存储过程第1关:创建存储过程

编程要求 1、创建第1个存储过程,并调用; 1)创建存储过程,查询emp表数据; 2)调用存储过程; --创建存储过程,获得计算机(cs)系学生选课情况并将结果写入临时表t…

免费wordpress中文主题

免费大图wordpress主题 首页是一张大图的免费wordpress主题模板。简洁实用,易上手。 https://www.jianzhanpress.com/?p5857 免费WP模板下载 顶部左侧导航条的免费WP模板,后台简洁,新手也可以下载使用。 https://www.jianzhanpress.com/…

d20(184-190)-勇敢开始Java,咖啡拯救人生

目录 网络通信 网络通信三要素(IP地址,端口号,协议 IP地址 InetAddress 端口号 协议 传输层的两个通信协议 UDP通信 java.net.Datagramsocket类 客户端 服务端 UDP通信多收多发 客户端 服务端 TCP通信 java.net.Socket类 客…

【MYSQL】分数排名

表: Scores ---------------------- | Column Name | Type | ---------------------- | id | int | | score | decimal | ---------------------- id 是该表的主键(有不同值的列)。 该表的每一行都包含了一场比赛的分数。Score 是…

Go微服务: 日志系统ELK的应用

概述 基于前文,我们已经了解并搭建完成ELK的所有环境了,现在我们来结合应用程序来使用ELK参考前文:https://active.blog.csdn.net/article/details/138898538 封装日志模块 在通用工具模块: gitee.com/go-micro-services/common 这个包是通…

【C语言】——函数栈帧的创建与销毁

函数栈帧的创建与销毁 本文主要讲解了函数调用过程中其栈帧的创建与销毁,内容干货较多,希望大家认真品味。 使用C语言进行函数调用时,是否会有很多疑问: 1.局部变量是如何创建的? 2.局部变量在未初始化的情况下&#x…

物理服务器介绍

物理服务器介绍 概述分类按服务器应用分类按服务器结构分类塔式服务器机架式服务器刀片式服务器机架式服务器与刀片式服务器的对比按处理器个数分类按处理器架构分类 主板概述工作原理物理结构技术参数 CPU概述工作原理指令集相关技术技术参数主流产品 内存概述类型相关技术技术…

安卓分身大师4.6.0解锁会员安卓14可用机型伪装双开多开

需登录解锁会员功能,除了加速进入不能, 其他主要功能都是可以使用,由于验证较多一些功能需要特定操作使用,进行伪装时请不要直接伪装,先生成成功后再进行自定义伪装!链接:https://pan.baidu.com…

Transformer详解(3)-多头自注意力机制

attention multi-head attention pytorch代码实现 import math import torch from torch import nn import torch.nn.functional as Fclass MultiHeadAttention(nn.Module):def __init__(self, heads8, d_model128, droput0.1):super().__init__()self.d_model d_model # 12…

通过el-tree自定义渲染网页版工作目录,实现鼠标悬浮显示完整名称、用icon区分文件和文件夹等需求

目录 一、通过el-tree自定义渲染网页版工作目录 1.1、需求介绍 1.2、使用el-tree生成文档目录 1.2.1、官方基础用法 ①效果 ②代码: 1.2.2、自定义文档目录(实现鼠标悬浮显示完整名称、用icon区分文件和文件夹) ①效果(直接效…

JavaScript表达式和运算符

表达式 表达式一般由常量、变量、运算符、子表达式构成。最简单的表达式可以是一个简单的值。常量或变量。例:var a10 运算符 运算符一般用符号来表示,也有些使用关键字表示。运算符由3中类型 1.一元运算符:一个运算符能够结合一个操作数&…

YOLOv8_seg的训练、验证、预测及导出[实例分割实践篇]

实例分割数据集链接,还是和目标检测篇一样,从coco2017val数据集中挑出来person和surfboard两类:链接:百度网盘 请输入提取码 提取码:3xmm 1.实例分割数据划分及配置 1.1实例分割数据划分 从上面得到的数据还不能够直接训练,需要按照一定的比例划分训练集和验证集,并按…

如何远程实时查看监控管理员工电脑屏幕?远程查看多台员工电脑屏幕的方法

现代化企业管理中,远程监控员工电脑屏幕已经成为一种有效的手段,用于提升工作效率、确保信息安全以及维护工作纪律。 而这种事情,也仿佛已经很常见了。 那么一般都如何监控的呢? 一、选择合适的远程监控软件 1.域智盾 域智盾提…

2024 电工杯高校数学建模竞赛(B题)数学建模完整思路+完整代码全解全析

你是否在寻找数学建模比赛的突破点?数学建模进阶思路! 作为经验丰富的数学建模团队,我们将为你带来2024电工杯数学建模竞赛(B题)的全面解析。这个解决方案包不仅包括完整的代码实现,还有详尽的建模过程和解…

markdown 文件渲染工具推荐 obsidian publish

背景 Markdown 是一种轻量级的标记语言,最开始使用它是觉得码字非常方便,从一开始的 word 排版到 markdown ,还不太不习惯,用了 obsidian把一些文字发在网上后,才逐渐发现他的厉害之处。 让人更加专注于内容本身&…

机器学习云环境测试

等待创建完成后,点击 PyTorch 打开,创建一个全新的 notebook 在 Cell 中输入如下代码,并点击 Run 完成后点击 New Cell ,在 New Cell 中输入如下代码 输入完成后点击 Run ,运行 New Cell 。(每个 Cell 代…

Java面试八股之Thread类中的yeild方法有什么作用

Thread类中的yeild方法有什么作用 谦让机制:Thread.yield()方法主要用于实现线程间的礼让或谦让机制。当某个线程执行到yield()方法时,它会主动放弃当前已获得的CPU执行权,从运行状态(Running)转变为可运行状态&#…

朴素贝叶斯+SMSSpamCollections

1. 打开 Jupyter 后,在工作目录中,新建一个文件夹命名为 Test01 ,并且在文件夹中导入数据 集。在网页端界面点击 “upload” 按钮,在弹出的界面中选择要导入的数据集。然后数据集出现 在 jupyter 文件目录中,此时…