单片机的一条指令: SJMP $ 是啥意思

单片机的一条指令: SJMP $ 是啥意思,第1张

SJMP $ 意思即跳转到本指令的起始位置开始执行,这样就变成了循环执行,即原地跳转,一般用来等待中断。

但是本指令也不宜滥用。这是一条死循环指令,如果系统的中断是开放的,那么SJMP $指令实际上是在等待中断,当有中断申请后,CPU 转至执行中断服务程序。

中断返回时,仍然返回到这条死循环指令,继续等待中断,而不是返回到该指令的下一条指令。这是因为执行SJMP $后,PC 仍指向这条指令,中断的断点就是这条指令的首字节地址

51单片机指令。

功能:短转移(Short Jump)

格式:SJMP rel ;

作用: PC <-PC+2 , PC <-PC+rel短转移指令(-128—+127范围内的转移指令)。

短转移指令的功能是先使程序计数器PC加1两次(即:取出指令码),然后把加2后的地址和rel相加作为目标转移地址。

因此,短转移指令是一条相对转移指令,是一条双字节双周期指令,指令码格式为:80H rel(操作码 地址偏移量),这里,80H是SJMP指令的操作码;rel是地址偏移量,在程序中也常采用符号地址,上机运行前才被代真成二进制形式。

扩展资料:

单片机指令系统:

MCS-51共111条指令。

指令分类:

1、按指令所占的字节来分:

(1)单字节指令(49条) 如MOV A,R2,(机器码11101010)

(2)双字节指令(46条) 如MOV A,#0BH,(机器码74H,0BH)

(3)三字节指令(16条) 如MOV 0BH, #0BH ,(机器码75H,0BH,0BH)

2、按指令的执行时间来分:(1个机器周期为12个时钟周期)

(1) 1个机器周期(64条) ,如MOV A,R2 MOV A,#0BH,

(2) 2个机器周期(45条) ,如MOV 0BH, #0BH

(3) 4个机器周期(2条) ,乘、除指令。

指令格式:

一、按操作码和操作数分。

1、操作码:用来规定指令进行什么操作。

如MOV A,#0BH,(机器码74H,0BH)

其中74H为操作码,指明“将立即数送入ACC”这种操作;

2、操作数:则是指令操作的对象,有可能是数据,也可能是地址。

如MOV A,#0BH,其中#0BH为操作数。

有单字节指令、双字节指令、三字节不同长度的指令,格式不同:

(1)单字节指令:操作码、操作数同在一个字节中。

(2)双字节指令:操作码+操作数。

(3)三字节指令:操作码+操作数+操作数。

二、按助记符和操作数分:

操作助记符[目的操作数,源操作数]

如MOV A,#0BH,(机器码74H,0BH),其中:

(1)MOV为操作助记符, 指明“内部数据传送”这种操作;

(2)A为目的操作数,指明“数据传送的目的寄存器”是A;

(3) #0BH为源操作数。

参考资料来源:百度百科-单片机指令

参考资料来源:百度百科-SJMP

单片机 SJMP $表示重复执行这条指令。

void main()

{ p1=0x00

while(1)

void DelayMS()

{ uchar i

while(10)

for(i=0i<120i+ +)

}

p1=!p1

}

2:

void timer_init()

{

TMOD=0x01

TH0=(65536-0)/256

TL0=(65536-0)%256

TR0=1

}

在上面程序1中,0x00表示一种状态,即表示单片机P1口八位都是低电位0,而不是表示为等于零无意义。

在程序2中,初值赋为零,则表示整个定时为65.536ms,是该定时方式的最大值,而初值0则仅表示该值为零,没有任何意义。

在单片机学习中,数值的表示方法是学习中应引起注意的细节,若不注意,有时因何而错,都分辨不清。

扩展资料

单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上,相当于一个微型的计算机。运行中也仅能处理数字信号。

单片机只能识别二进制数,也就是高低电平1与0。但当数值太大时,用1和0来表示程序中的数值时显得太繁锁了,于是便用十六进制来表示。这样表示起来方便,通用,

为了让单片机按照我们的要求来工作,就必须对它赋予指令也就是编写程序,在程序中同一个数值会因应用的位置不一样,而理解含义就不一样。

如下面程序1中用十六进制表示的0x00和定时程序2赋初值时用0(0=0x00)表示的初值。它们在不同程序中所表示的意义也不一样,理解起来也就不能用同一种思维方式去理解。

MCS-51的控制转移类指令,共17条,分为无条件转移指令、条件转移指令、子程序调用和返回指令、空操作指令等四类。

无条件转移指令(共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);

第二条指令叫作绝对转移指令(Absolute Jump);

第三条指令称作短转移指令(Short Jump);

第四条指令是变址寻址转移指令(散转指令)。

显然,每条指令均以改变程序计数器PC(Program Counter)中的内容为宗旨。

(1)长转移指令(64KB范围内转移指令)

长转移指令的功能是:把指令码中的目标地址addr16装入程序计数器PC,使机器执行下一条指令时无条件转移到addr16处执行程序,不影响任何标志。由于addr16是一个16位二进制地址(地址范围为0000H—FFFFH),因此长转移指令一条可以在64KB范围内转移的指令。为了使程序设计方便易编,addr16常采用标号地址(如:LOOP、LOOP1、MAIN、START、DONE、NEXT1……)表示,只有在上机执行前才被汇编(或代真)为16位二进制地址。

长转移指令为三字节,双周期指令。

上机试试吧!很直观的! For Example: LJMP F886H

注意:

在下载的这个8051DEBUG软件中,不支持标号,且程序状态字PSW(Program State Word)中的D0位,即奇偶标志位P,与正确的正好相反,这一点是错误的,用的时候留意一下。

只要记好:累加器ACC中1的个数为奇数,则P=1;否则P=0。

(2)绝对转移指令(2KB范围内的转移指令)

绝对转移指令是一条双字节双周期指令,11位地址addr11(a10—a0)在指令中的分布是:

a10 a9 a8 0 0 0 1|a7 a6 a5 a4 a3 a2 a1 a0,其中,00001B是操作码。在程序设计中,11位地址也可以用符号表示,但在上机执行前必须按照上述指令格式加以代真。

绝对转移指令执行时分为两步:

第一步是取指令操作,程序计数器PC中内容被加1两次;

第二步是把PC加2后的高5为地址PC15—PC11和指令代码中低11位构成目标转移地址:PC15—PC11 a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0

其中,a10—a0的地址范围是全“0”——全“1”。因此,绝对转移指令可以在2KB范围内向前或向后跳转。

如果把单片机64KB寻址区分成32页(每页2KB),则PC15—PC11(00000B—11111B)称为页面地址(即:0页—31页),a10—a0称为页内地址,但应注意:AJMP指令的目标转移地址不是和AJMP指令地址在同一个2KB区域,而是应和AJMP指令取出后的PC地址(即:PC+2)在同一个2KB区域。例如:若AJMP指令地址为2FFEH,则PC+2=3000H,故目标转移地址必在3000H—37FFH这2KB区域中。

例如:MGH2001:AJMP addr11,

其中,MGH2001为AJMP addr11指令的标号地址,由该指令在程序存储器中的位置确定,addr11为11位地址,试分析该指令执行后的情况以及指令码的确定方法。

解:设MGH2001=3100H,addr11=10110100101B,则根据上述指令码格式可得绝对转移指令的格式码为:1 0 1| 0 0 0 0 1|1 0 1 0 0 1 0 1|(a10 a9 a8|操作码|a7—a0|)

即:A1A5H。该指令执行后:

PC15——PC11 a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0

PC= 0 0 1 1 0 1 0 1 1 0 1 0 0 1 0 1 B =35A5H

即:程序转移到35A5H处执行。

(3)短转移指令(-126—+129范围内的转移指令)

短转移指令的功能是先使程序计数器PC加1两次(即:取出指令码),然后把加2后的地址和rel相加作为目标转移地址。因此,短转移指令是一条相对转移指令,是一条双字节双周期指令,指令码格式为:80H rel(操作码 地址偏移量),这里,80H是SJMP指令的操作码;rel是地址偏移量,在程序中也常采用符号地址,上机运行前才被代真成二进制形式。

遇到具体问题时,头脑中一定要清楚一个关系式:目标转移地址=源地址+2+rel

(4)变址寻址转移指令(只能在256个存储器单元内转移)

这是一条单字节双周期无条件转移指令。

在指令执行之前,用户应预先把目标转移地址的基地址送入DPTR,目标转移地址对基地址的偏移量放在累加器A中。在指令执行时,MCS-51单片机把DPTR中基地址和累加器A中地址偏移量相加,以形成目标转移地址送入程序计数器PC中。

通常,DPTR中基地址是一个确定的值,常常是一张转移指令表的起始地址,累加器A中之值为表的偏移量地址,机器通过变址寻址转移指令便可实现程序的分支转移跳转的范围不一样,可以说是到达的远近距离不一样。存储空间占用不一样。

AJMP 的范围是11位地址,也就是2K的空间内,占用存储空间2个字节,执行周期24个时钟周期。

LJMP 的范围是16位地址,也就是64K的空间内,占用存储空间3个字节,执行周期24个时钟周期。

SJMP 的范围是8位地址,也就是256BIT的空间内,占用存储空间2个字节,执行周期24个时钟周期。

JMP一般配合DPTR使用,存储空间1个字节,执行周期24个时钟周期。一般用于多分枝选择的时候使用,比如按键处理。

ACALL,LCALL和以上说明类似,是调用指令,ACALL占用存储空间2个字节,执行周期24个时钟周期。LCALL占用存储空间3个字节,执行周期24个时钟周期。


欢迎分享,转载请注明来源:聚客百科

原文地址: https://juke.outofmemory.cn/pretty/2832853.html

()
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-01-30
下一篇 2023-01-30

发表评论

登录后才能评论

评论列表(0条)

保存