单片机SJMP指令中,rel为负数时,反向转移是什么意思?怎么计算?谢谢高人指点。
单片机编程语言很多,大致分成三类:机器语言、汇编语言、高级语言。机器语言由于繁琐容易出错,大部分用户已经不再便用。
1.单片机的汇编语言
汇编语言是一种用文字助记符来表示机器指令的符号语言,是最接近机器码的一种语言。其主要优点是占用资源少,程序执行效率高,由于它一条指令就对应一条机器码,每一步的执行动作都很清楚,并且程序大小和堆栈调用情况都容易控制,调试起来也比较方便。但是不同的类型的单片机,其汇编语言可能有点差异,所以不易移植,因为他们的指令系统是有区别的。但懂得汇编语言可帮助了解影响川可语言效率的特殊规定。例如,懂得汇编语言指令就可以便用在片内ram作变量的优势,因为片外变量需要几条指令才能设署累加器和数据指针进行存取。同样的,当要求便用浮点数和启用函数时也只有具备汇编编程经验才能避免生成庞大的、效率低的程序,对于这方面的编程,没有汇编语言是做不到的。
2.单片机的C语言
单片机的C语言是一种编译型程序设计语言,它兼顾了多种高级语言的特点,并具备汇编语言的功能。C语言具有功能丰富的库函数,运算谏磨快,编译效率高,有良好的可移植性,而且可以实现直接对系统硬件的控制。此外,C语言程序具有完整的程序模块结构,从而为软件开发中栗用模块化程序设计方法提供了有力的保障。与汇编相比,有如下优点:
对单片机的指令系统不要求了解,仅要求对51的存储器结构有初步了解,至于寄存器分配、不同存储器的寻址及数据类型等细节均由编译器管理。程序有规范的结构,可分为不同的函数。这种方式可便程序结构化,将可变的选择与特殊操作组合在一起,改善了程序的可读性。
编程及程序调试时间显著缩短,从而提高效率。提供的库包含许多标准子程序,具有较强的数据处理能将已编好程序可容易的植入新程序,因为它具有方便的模块化编程技术。
功能强而有弹性,提供的库包含许多标准子程序,具有较强的数据处理能力,能将已编好程序容易的植入新程序,因为它具有方便的模块化编程技术。
单片机C语言作为一种非常方便的语言而得到广泛的支持,(语言程序本身并不依赖于机器硬件系统,基本上不做修改就可根据单片翻U均不同较快地移植过来。
用单片机c语言进行程序设计,已成为单片机软件开发的一个主流,作为一个技术全面并涉足较大规模的软件系统开发的单片机开发人员最好能够掌握基本的C语言编程。
拓展资料
单片机,全称单片微型计算机(英语:Single-Chip Microcomputer),又称微控制器(Microcontroller),是把中央处理器、存储器、定时/计数器(Timer/Counter)、各种输入输出接口等都集成在一块集成电路芯片上的微型计算机。与应用在个人电脑中的通用型微处理器相比,它更强调自供应(不用外接硬件)和节约成本。它的最大优点是体积小,可放在仪表内部,但存储量小,输入输出接口简单,功能较低。由于其发展非常迅速,旧的单片机的定义已不能满足,所以在很多应用场合被称为范围更广的微控制器;由于单芯片微电脑常用于当控制器故又名single chip microcontroller,但是目前在中国大陆仍多沿用“单片机”的称呼。
单片机c语言比起普通C语言增加了一些基本的指令,变量的赋值是16进制,当然单片机c语言只牵涉到普通c语言的基础部分。具体体现在:
1、单片机中C的语法一般都对 ANSI C有些扩展,及一些特殊写法 如C51扩展的 data xdata bit sbit 一类的,还有一些中断程序写法 void int() interrput 1 一类的。
2、C是一门语言,由对应平台的编译器编译成对应平台汇编的程序,各平台的汇编不一样,当然编译器也不一样 DOS上的TC2 TC3 WINDOWS上的VC 8051的C51都有自已的编译器 。具体区别是由编译器决的,只能参考对应的编译手册,即使同种平台不同的编译器对C的扩展也有不同。
3、单片机c语言编程是基于C语言的单片机编程。单片机的C语言采用C51编译器(简称C51)。由C51产生的目标代码短,运行速度高,存储空间小,符合C语言的ANSI标准,生成的代码遵循Intel目标文件格式,而且可与A51汇编语言PL/M51语言目标代码混合使用。
C51本质就是C,是为在单片机上使用C而出来的,如果C不牢固,还是多掌握一点C再学C51,不过新增的知识也不少,而且基本上跟C无关。
4、C只是一种高级语言。它除具有一般高级语言的功能特性外,它可以很好的操作底层的硬件接口。在C语言的基础上,如果你把一些单片机的端口或特殊功能寄存器加于定义,使之方便于在 写语句的时候,直接直观的编写。这样就差不多是单片机C语言。
C语言的特性差不多都可以用于单片机C语言,因为它们的编译机理都是一样的。
扩展资料:
C语言:
C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。
C语言是一门面向过程的计算机编程语言,与C++,Java等面向对象的编程语言有所不同。
其编译器主要有Clang、GCC、WIN-TC、SUBLIME、MSVC、Turbo C等。
单片机的C语言:
单片机软件设计使用C语言作为编程开发软件,采用模块化的程序结构,设计了按键模块程序、RFID模块程序、日历时钟模块程序、GPRS模块程序、显示存储模块程序等,并编写系统主程序,将五个程序模块组合在一起,实现单片机控制系统的整体功能。
51单片机支持三种高级语言,即PL/M,C和BASIC。C语言是一种通用的程序设计语言,其代码率高,数据类型及运算符丰富,并具有良好的程序结构,适用于各种应用的程序设计,是目前使用较广的单片机编程语言。
单片机的C语言采用C51编译器(简称C51)。有C51产生的目标代码短,运行速度高,所需存储空间小,符合C语言的ANSI标准,生成的代码遵循Intel目标文件格式,而且可与A51汇编语言或PL/M51语言目标代码混合使用
参考资料:
C语言-百度百科
单片机C语言-百度百科
sjmp指令是什么意思
以单片机为例,其sjmp指令即跳转到本指令的起始位置开始执行,这样就变成了循环执行,即原地跳转,一般用来等待中断。单片机(Microcontrollers)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I\/O口和中断系统、定时器\/计数器等功能(...
单片机SJMP指令中,rel为负数时,反向转移是什么意思?怎么计算?谢谢高人...
以SJMP为原点,可以往前跳,正向跳转,往后跳,反向跳转。假设SJMP指令所在地址为0110H,因为要取出SJMP指令,是两个字节,那当前地址要加2,为0112H,反向跳转的目的地址是0110H,则跳转偏移量rel=0110H-0112H=-12H。rel为负数,但要用补码表示,为EFH。
单片机的一条指令: SJMP $ 是啥意思
SJMP $意味着跳转到该指令的开头以开始执行,因此它变为循环执行,就地跳转,通常用于等待中断。但是本指令也不宜滥用。这是一条死循环指令,如果系统的中断是开放的,那么SJMP $指令实际上是在等待中断,当有中断申请后,CPU 转至执行中断服务程序。中断返回时,仍然返回到这条死循环指令,继续等待中断...
懂单片机的高人请进,在相对转移指令SJMP中rel是正数和负数有什么区别...
rel=0A6H 这才是个负数,最高位符号位为1 0A6H就是 负的5AH 负数用补码来存,取反加1 SJMP 是2000H 2013H-2000H = 13H 13H-02H=11H 再减去指令本身的占用的2个字节的地址。相对地址是11H
SJMP $单片机这条指令到底是干嘛用的,我看每个程序后面基本都有,没有...
sjmp 是 单片机中的 无条件跳转命令,后面跟随的是 跳转的地址;而 $ 该符号,在汇编语言中,表示 本行地址 的意思,于是 SJMP $,就表示跳转到本行。表现的结果就是:死循环。一般在程序结尾使用,功能是,保持单片机程序不结束(以免程序重新运行)
单片机sjmp指令偏移量正负怎么判断
偏移量,是一个字节的补码。80H,就是-128,目的地就是 2100H+2-128 = 2082H。7FH,就是+127,目的地就是 2100H+2+127 = 2181H。
单片机中 SJMP $ 什么意思?
单片机 SJMP $表示重复执行这条指令。void main(){ p1=0x00;while(1)void DelayMS(){ uchar i;while(10)for(i=0;i<120;i+ +);} p1=!p1;} 2:void timer_init(){ TMOD=0x01;TH0=(65536-0)\/256;TL0=(65536-0)%256;TR0=1;} 在上面程序1中,0x00表示一种状态,即表示单片机P1...
51单片机指令SJMP的转移是以下一条指令首地址为基准的吗?
是的,51单片机 指令SJMP的转移是以下一条指令首地址为基准的。SJMP指令是两个字节,所以,也可以将SJMP指令的地址+2(即下条指令的首地址)作为基准,因为,在计算SJMP指令的偏移地址时,是按本条指令的地址来计算的,并不是取下条指令的地址。
单片机在执行程序中的SJMP $ 指令时,解释为踏步或终止,这时CPU在工作...
因51单片机中没有暂停指令,所有,有些程序为了让单片机执行完本段程序后实现相当于暂停的效果,不允许再继续执行,就用一条SJMP $ 指令,其实就是在本条指令处无限循环下去,即所谓的死循环,当然就不会向下执行其它指令了,这时CPU仍然在继续工作了,一切正常,只不过不再执行其它指令罢了。
单片机指令SJMP小问题!!
指令存放在2个单元里,那是因为这个指令占2个字节,一个指令字节,一个跳转偏移。它告诉你这个指令存在什么地方,是因为SJMP的执行的是相对跳转,也就是从这个当前地址向前后向后跳多少个字节。SJMP rel8 执行的操作如下:PC = PC + 2 这是SJMP这条指令所占用的空间 PC += rel8 所以当执行到SJMP ...
苗败银丹:[答案] 5AH本身就是个正数,后面的(正数)也只是个特别说明,不写,5AH也是正数. 转移目的地址还是 215CH rel=0A6H 这才是个负数,最高位符号位为1 0A6H就是 负的5AH 负数用补码来存,取反加1 SJMP 是2000H 2013H-2000H = 13H 13H-02H=11...
亚东县13214659041: 在51单片机SJMP rel 那PC地址等于PC+2+rel那地址不是越加越大吗?如何跳转到前面 - ?
苗败银丹: 在51单片机SJMP rel 那PC地址等于PC+2+rel,这个rel是相对地址,可以正可负,范围在-127~128之间,当为负数时就向前转移了.比如: SJMP $ rel=-2 PC=PC+2 PC<---PC+(-2) 所以是原地循环.
亚东县13214659041: 单片机的基本指令有哪些 - ?
苗败银丹: 不知道你是问的哪种单片机下面给你的是MCS-51的,希望对你有帮助,如有,麻烦采纳,谢谢 数据传送指令共有29条,数据传送指令一般的操作是把源操作数传送到目的操作数,指令执行完成后,源操作数不变,目的操作数等于源操作数....
亚东县13214659041: 单片机如何识别选择0、正数、负数 - ?
苗败银丹: 指令jz 或者jnz是判断0的指令,正负可以判断acc.7这一位. PNZ:MOV 20H,#0MOV 30H,#0MOV 40H,#0MOV R0,#60H LOOP:MOV A,@R0JNZ LP1INC 20HSJMP LP3 LP1:JB ACC.7,LP2INC 30HSJMP LP3 LP2:INC 40H LP3:INC R0CJNE R0,#65H,LOOPRET
亚东县13214659041: 单片机汇编语言中比较指令 - ?
苗败银丹: 刚好也有这么个困惑,已经解决了,拿出来分享下 比较转移指令 CJNZ CJNE A,#data,rel CJNE A,direct,rel CJNE Rn,#data,rel CJNE @Ri,#data,rel 第一条指令的功能是将A中的值和立即数data比较,如果两者相等,就次序执行(执行本 指令的...
亚东县13214659041: 51单片机子程序中使用JMP(AJMP,LJMP,SJMP)指令 执行RET能不能回到主程序? - ?
苗败银丹: 我仔细看了一下所有人的回答,有根本没看懂楼主问题答非所问的,也有回答的差不离的,我来切一下重点好了. 楼主这所有问题其实归根结底就是一个问题,堆栈和SP(堆栈指针)的问题 CALL指令执行时,就是先把当前程序指针压入堆栈...
亚东县13214659041: 简述SJMP.AJMP.LJMP的异同点,谢谢啦,考试呢 - ?
苗败银丹: 无条件转移指令(共4条) LJMP addr16 ; PC〈—— addr16 AJMP addr11 ; PC〈—— PC+2 , PC10-0〈—— addr11 SJMP rel ; PC〈—— PC+2 , PC 〈—— PC+rel JMP @A+DPTR ; PC〈—— A+DPTR 第一条指令称为长转移指令(Long Jump...
亚东县13214659041: 怎么知道单片机中的16进制数是正数还是负数 - ?
苗败银丹: 看最高位是0还是1,是1的就是负数 .0E6H的二进制数是1110 0110 ,所以是负数 .
亚东县13214659041: 51单片机指令中,如何给rel赋值 - ?
苗败银丹: JC rel 若转移操作指令操作码存放在1000H,偏移量存放在1001H,则该指令执行后PC已为1002H.这个PC值是怎么算出来的? 回答:这是个条件转移指令当进位标志CY=0 不满足条件 时, (PC)=1002H 不转移 顺序执行下一条指令当进位标志CY=1 满足条件时, (PC)=1002H+rel 程序跳转到目标地址上 呵呵 满意 就选满意回答
亚东县13214659041: 单片机指令DJNZ的用法 - ?
苗败银丹: DJNZ指令有两种格式:DJNZ Rn,rel和DJNZ direct,rel,前者为双字节指令,其中第二个人字节存储rel的相对地址,范围是-128~+127,所以转移范围很窄,所以转移的位置为指令的当前PC值加上rel;第二条指令的第三个字节也是存储rel的,和第一条指令的转移方式相同,都是PC+rel,你的想法是对的.Sjmp实现原地跳转时只能用$,没听说过直接用绝对地址的数值来表示的."D2"在源代码中是标号,但是编译器在将其翻译为机器代码时会自动计算出它的物理地址并且用在指令中.一般只源代码中都使用标号来表示地址,几乎不同数字来直接表示地址,因为计算地址是很复杂的问题.