相对跳转指令和绝对跳转指令的特殊用法
3.4功能指令

名称
子程序调用
D ( . )
指针 P0~P62 嵌套 5 级 无
应用举例1:
X0
是子程序执行的条件,当 X0 置 1 时标号为 P10 的子程 序得以执行。 子程序 P10 安排在主程序结 束指令 FEND 之后,END之前。 标号 P10 和子程序返回指令 SRET 间的程序构成了 P10 子 程序的内容。 当主程序带有多个子程序时, 子程序可依次列在主程序结束 之后。并以不同的标号相区别 。
定Z,即代表了VZ。
FXON中只有V0和Z0。 D8028中保存Z0的值,D8029中
保存V0的值(只读)。
FX2N中只有V0-V7和Z0-Z7。D8028中保存Z0的值,
D8029中保存V0的值(只读)。其余分别保存在D8082-D8095 中。
变址寄存器当前值寄存器
D8028中保存Z0的值,D8029中保存V0的值(只读)。其余分别保存在
FX系列PLC的功能指令
FX系列PLC的功能指令
又称高级/应用指令。实际上是调用一个个功能不同的子 程序,既能简化程序设计,又能完成复杂的数据传送、运 算、变换和程序控制等高难度控制。 三菱FX2的功能指令有87条,FX2N 有128条(有的标246) ,各指令用功能号FNC□□表示;每一指令有与之对应的 助记符表示其功能意义。如FNC00(CJ)表示条件跳转。
)
3# SB3 2# 1# SB2 SB1
FEND 主程序结束 M8000 中断指针I001 (X0的上升沿中断) M8000 中断指针I101 (X1的上升沿中断) M8000 中断指针I201 (X2的上升沿中断) Y2 (中断子程序3) IRET 中断返回 END (a)输入中断(抢答电路)梯形图 中断抢答 已验证 Y1 (中断子程序2) IRET 中断返回 Y0 (中断子程序1) IRET 中断返回
51指令集

1、数据传送类指令1. MOV:MOV (目的字节),(源字节);2. MOVC:和MOV用法基本相同,主要用于ROM查表,也就是基址变址中。
3. MOVX:和MOV用法基本相同,主要读写片外RAM中,也就是间接寻址,如MOVX A,@Ri 。
4. PUSH:主要用于堆栈操作中的压栈操作,例如:(SP)=07H,(40H)= 88H,执行指令PUSH 40H后,(SP)= 08H)(08H)= 88H。
其中,SP为堆栈指针,压栈之后堆栈指针加一。
5. POP:主要用于堆栈操作中的弹栈操作,(SP)= 5FH,(5FH)= 90H,执行指令POP 70H后,(70H)= 90H,(SP)= 5EH,弹栈后堆栈指针减一。
6. XCH:主要用于两个数据之间交换,例如:(R0)= 80H,(A)= 20H。
执行指令XCH A,R0后,(A)= 80H,(R0)= 20H。
7. XCHD:这个指令的主要功能是间址操作数的低半字节与A的低半字节内容相互交换。
例如:(A)= 20H,(R0)= 30H,(30H)= 67H。
执行XCHD A,@R0后(A)= 27,(30H)= 60H.8. SWAP:这个指令的功能是累加器的高、低四位进行互换。
例如:(A)= 23H,执行SWAP A指令之后(A)= 32H。
2、算术运算类指令1) 加法a) 不带进位加法影响程序状态字标志位PSW中的CY(CY是进位标志位,即和的D7为有进位时(CY)=1,否则,(CY)= 0)、AC(AC为辅助进位标志位,当D3为有进位时为1,否则为0)、OV(和的D7和D6为只有一个进位时为1,否则为0)和P(当累加器ACC中的1为奇数时为1,否则为0)例如:(A)=84H,(30H)=8DH,执行指令ADD A,30H结果A =11Hb) 带进位加法影响的程序状态字标志位与不带进位的加法相同。
表达形式为ADDCA,Rnc) 增一例如:INC A A的数值自加一d) 十进制调整当累加器A中的低4位数出现了非BCD码或第四位产生进位时,应在第四位加六调整,以产生第四位正确的BCD码结果。
c语言跳转指令

c语言跳转指令C语言跳转指令跳转指令是C语言中非常重要的一类指令,也被称为控制流指令。
它们可以改变程序的执行顺序,使程序按照我们想要的方式运行。
本文将介绍C语言中常见的跳转指令及其用法。
1. goto语句goto语句是C语言中最基本的跳转指令。
它可以让程序直接跳转到代码中任意一个标签处继续执行。
goto语句的基本格式如下:```goto label;```其中,label是定义在代码中某个位置处的标签名,它通常用于标识一个需要跳转到的位置。
例如:```int i = 0;loop:i++;if (i < 10) {goto loop;}```这段代码会一直循环执行,直到i大于等于10时才停止。
在循环体内部,使用了一个名为loop的标签来标识循环体的起始位置,在if条件判断失败时会跳转回该位置。
goto语句虽然功能强大,但也容易造成代码结构混乱、可读性降低等问题,因此在实际编程过程中应尽量避免使用。
2. break和continue语句break和continue是两种常见的控制流指令,它们通常用于循环体内部。
break语句可以让程序跳出当前的循环体,继续执行循环体之后的代码。
例如:```for (int i = 0; i < 10; i++) {if (i == 5) {break;}printf("%d ", i);}```这段代码会输出0 1 2 3 4,并在i等于5时跳出循环。
continue语句可以让程序跳过当前的循环迭代,直接进入下一次迭代。
例如:```for (int i = 0; i < 10; i++) {if (i == 5) {continue;}printf("%d ", i);}```这段代码会输出0 1 2 3 4 6 7 8 9,并在i等于5时跳过该次迭代。
3. return语句return语句是C语言中最常见的一种控制流指令,它用于返回函数执行结果并结束函数的执行。
汇编语言跳转指令

汇编语言跳转指令在计算机编程中,汇编语言是与机器语言最接近的一种编程语言,它使用助记符来表示指令和数据,通过编写汇编语言程序可以直接操控计算机的底层硬件。
在汇编语言中,跳转指令是非常重要的一种指令,它用于修改程序的执行流程,实现程序的控制和逻辑跳转。
本文将介绍汇编语言中常见的跳转指令及其使用方法。
一、无条件跳转指令1. JMP(跳转)指令JMP指令用于无条件地跳转到指定的目标地址。
它可以直接跳转到一个标签或者给出一个绝对地址作为跳转目标。
下面是JMP指令的语法格式:JMP 目标地址例如,要跳转到标签"LOOP"所在的位置,可以使用以下指令:JMP LOOP2. JC(进位跳转)指令JC指令用于判断运算结果是否产生了进位,并根据判断结果进行跳转。
如果进位标志位CF被设置为1,则跳转到指定的目标地址;否则,继续顺序执行下一条指令。
下面是JC指令的语法格式:JC 目标地址例如,要在进位发生时跳转到标签"OVERFLOW"所在的位置,可以使用以下指令:JC OVERFLOW二、条件跳转指令条件跳转指令用于根据特定条件是否满足来进行跳转。
常用的条件跳转指令有以下几种:1. JE/JZ(等于/零)指令JE/JZ指令用于判断两个数是否相等或某个操作数是否为零,并根据判断结果进行跳转。
如果条件满足,则跳转到指定的目标地址;否则,继续顺序执行下一条指令。
下面是JE/JZ指令的语法格式:JE/JZ 目标地址例如,要在相等时跳转到标签"EQUAL"所在的位置,可以使用以下指令:JE EQUAL2. JNE/JNZ(不等于/非零)指令JNE/JNZ指令用于判断两个数是否不相等或某个操作数是否非零,并根据判断结果进行跳转。
如果条件满足,则跳转到指定的目标地址;否则,继续顺序执行下一条指令。
下面是JNE/JNZ指令的语法格式:JNE/JNZ 目标地址例如,要在不相等时跳转到标签"UNEQUAL"所在的位置,可以使用以下指令:JNZ UNEQUAL3. JA/JNBE(大于/不低于)指令JA/JNBE指令用于比较两个数的大小关系,并根据判断结果进行跳转。
详解PLC编程跳转指令的使用方法

详解PLC编程跳转指令的使用方法条件跳转指令:指令名称,助记符,指令代码,程序步如下表:程序步可以是连续执行或者是脉冲执行,CJ执行的为3步,CJ(P)为1步。
指令格式:当我们按下X000后,程序跳转指令开始运行,程序所跳转的位置为程序指针所在的位置,也就是标号10,在这里我们要注意程序指针写在左母线的左边。
当我们启动跳转指令后,X001这段程序就会被跳过不执行。
当X0为ON时,被跳转CJ命令到标号之间的程序不子执行。
在跳转过程中如果Y、M,S被OUT、SET. (RS)T指令驱动使输入发生变化则仍保持跳转前的状态。
例如,通过X1驱动输出Y10后发生跳转,在跳转过程中即使X0变为ON,但输出Y10仍有效。
注意:1、对于T、C,如果跳转时(定时器)或计数器正发生动作,则此时立即中断计数或停止计时,直到跳转结束后继续进行计时或计数。
但是,正在动作的定时器T192~T199与高速计数器C235~ C255. 不管有无跳转仍旧维续工作。
2、功能指令在跳转时不执行,但PLSY、PLSR、PWW指令除外。
子程序调用与返回指令:指令名称,助记符,指令代码,程序步如下表:指令格式:图中FEND表示主程序结束,在FEND前面的我们称为主程序,在FEND后面的我们称为子程序。
SRET表示子程序结束,或者叫子程序返回。
我们要注意,在FEND与SRET之间的程序,我们称为第一个子程序,在第二个SRET之前的我们称为第二个子程序。
当我们按下X001的时候,指针调用到P11,程序开始从P11这个地方从上往下开始执行,当碰到第一个SRET的时候,程序又返回到主程序中,但是在这个程序中如果X002被接通,那么程序指针则调用到P12,程序开始从上到下运行,当碰到第二个SRET的时候,程序返回到P12这个地方,然后在碰到第一个SRET的时候,返回到主程序。
因为P12这个程序是嵌套在P11这个程序中的,所以我们要注意,在(PLC)中这种程序嵌套最多只能使用5级。
内容一 51单片机汇编指令..

算术指令用到的助记符共有8种:ADD、ADDC、INC、
SUBB、DEC、DA 、MUL、DIV。 算术运算指令执行结果将影响进位标志(Cy),辅助进位标 志(Ac)、溢出标志位(Ov)。
三、51单片机指令
• 加法指令
①普通加法指令 ADD A,Rn ;A(A)+(Rn) ADD A,direct ;A(A)+(direct) ADD A,@Ri ;A(A)+((Ri)) ADD A,#data ;A(A)+ data ②带进位的加法指令 ADDC A,Rn ;A(A)+(Rn)+(Cy) ADDC A,direct ;A(A)+(direct)+(Cy) ADDC A,@Ri ;A(A)+((Ri))+(Cy) ADDC A,#data ;A(A)+ data+(Cy)
原操作数所替代。
数据传送类指令用到的助记符有:MOV,MOVX,MOVC, XCH,XCHD,PUSH,POP,SWAP。
三、51单片机指令
• 内部数据传送类指令 MOV
格式: MOV [目的操作数],[源操作数] 功能:目的操作数(源操作数中的数据)
①以累加器为目的操作数的内部数据传送指令
MOV MOV MOV MOV A,Rn; A,direct; A,@Ri; A,#data; A(Rn) A(direct) A((Ri)) Adata
三、51单片机指令
指令符号意义:
符 号 Rn Ri #data addr16 addr11 direct 含 义 表示当前选定寄存器组的工作寄存器R0~R7 表示作为间接寻址的地址指针R0~R1 表示8位立即数,即00H~FFH 表示16位地址,用于64K范围内寻址 表示11位地址,用于2K范围内寻址 8位直接地址,可以是内部RAM区的某一单元或某一专用功能寄存器的地址
跳转指令——精选推荐

跳转指令跳转指令有:JMP、JECXZ、JA、JB、JG、JL、JE、JZ、JS、JC、JO、JP等等JMP:⽆条件跳转,相当于C语⾔的gotoJCC:根据指定的条件确定程序是否发⽣转移,条件满⾜,发⽣转移,否则,顺序执⾏下条指令JECXZ:ECX为0则跳转⽤有16条指令,分两类:①单个标志状态作为条件 5个状态标志ZF、CF、SF、OF和PF的10种状态②两数⼤⼩关系作为条件 ㈠⽐较⽆符号整数的⼤⼩: 低于、不低于、低于等于、⾼于 ㈡⽐较有符号整数⼤⼩: ⼩于、不⼩于、⼩于等于、⼤于标志状态作为条件:②利⽤零位标志ZF的条件转移指令:JZ:运算结果为0 (ZF=1)JNZ:结果不为0 (ZF=0)JE:两数相等 (ZF=1)JNE:不相等 (ZF=0)②利⽤进位标志CF的条件转移指令:JC:运算结果有进位/借位(CF=1)JNC:运算结果没有有进位/借位(CF=0)③利⽤溢出标志OF的条件转移指令:JO:运算结果有溢出(OF=1)JNO:结果没有溢出(OF=0)④利⽤符号标志SF的条件转移指令:JS:运算结果是负、最⾼位为1(SF=1)JNS:结果是正、最⾼位为0(SF=0)⑤利⽤奇偶标志PF的条件转移指令:JP:低8位结果中1的个数为偶或0(PF=1)JPE:低8位结果中1的个数为偶或0(PF=1)JNP:低8位结果中1的个数为奇(PF=0)JPO:低8位结果中1的个数为奇(PF=0)⑴两个⽆符号整数⼤⼩关系的条件转移指令:JB:⽆符号低于JNAE:⽆符号不⾼于等于JNB:⽆符号不低于JAE:⽆符号⾼于等于JBE:⽆符号低于等于JNA:⽆符号不⾼于JNBE:⽆符号不低于等于JA:⽆符号⾼于⑵两个有符号整数⼤⼩关系的条件转移指令:JL:⼩于JNGE:不⼤于等于JNL:不⼩于JGE:⼤于等于JLE:⼩于等于JNG:不⼤于JNLE:不⼩于等于JG:⼤于。
跳转指令的实现原理

跳转指令的实现原理引言概述:跳转指令是计算机程序中常用的指令之一,它允许程序在执行过程中跳转到指定的地址继续执行。
本文将介绍跳转指令的实现原理,包括指令的分类、执行过程以及常见的应用场景。
正文内容:1. 跳转指令的分类1.1 无条件跳转指令无条件跳转指令是指在程序执行过程中,无论条件是否满足,都会执行跳转操作。
这类指令通常使用绝对地址或相对地址来指定跳转目标。
1.2 条件跳转指令条件跳转指令根据特定条件的满足与否来决定是否执行跳转操作。
条件跳转指令通常使用标志寄存器中的标志位来判断条件是否满足,如零标志位、进位标志位等。
1.3 直接跳转指令直接跳转指令是指跳转目标地址在指令中直接给出的指令。
这类指令通常使用绝对地址进行跳转。
1.4 间接跳转指令间接跳转指令是指跳转目标地址在指令执行过程中通过寄存器或内存中的数据来获取的指令。
这类指令通常使用寄存器的内容或内存中的数据作为跳转目标地址。
2. 跳转指令的执行过程2.1 获取跳转地址在执行跳转指令之前,需要首先获取跳转目标地址。
跳转目标地址可以通过指令中的地址字段、寄存器或内存中的数据来获取。
2.2 转移控制获取跳转地址后,计算机将会根据跳转指令的类型和跳转目标地址执行相应的操作。
对于无条件跳转指令,计算机会直接跳转到指定地址;对于条件跳转指令,计算机会根据标志位的状态来决定是否跳转。
2.3 更新程序计数器在执行跳转指令后,计算机会更新程序计数器的值,使其指向跳转后的下一条指令,以便程序能够继续执行。
3. 跳转指令的应用场景3.1 函数调用在程序中,函数调用通常会使用跳转指令来实现。
当程序执行到函数调用指令时,会跳转到函数的入口地址,并执行函数中的代码。
函数执行完毕后,会通过返回指令跳转回函数调用的位置。
3.2 循环控制跳转指令也广泛应用于循环控制中。
通过跳转指令,程序可以在满足特定条件时跳转到循环体的起始位置,实现循环执行的功能。
3.3 异常处理在程序执行过程中,可能会出现各种异常情况,如除零错误、越界访问等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
0x0000001C 0x00000018 0x00000014 0x00000010 0x0000000C 0x00000008 0x00000004 0x00000000 编译地址等于运行地 址, 使用绝对跳转指令 正确的情况
编译地址不等于运行 地址, 使用绝对跳转指 令出错的情况
因此我们在看 linux 内核启动这部分的代码时只能看到顺序执行指令和相对跳转指令, 不会存在绝对跳转指令,就是这个原因。如果需要使用全局变量或者函数指针时,则需要将 这个地址减去 0xC0000000 的偏移量才可以获取到此时运行的地址,因为全局变量和函数指 针在编译时都是按照 0xC0000000 基址编译出的绝对地址,运行时既然将程序段和数据段都 偏移了 0xC0000000 的距离,那么使用时只要减去这个值就可以找到正确的位置了。 当 linux 内 核 完 成 初 始 化 时 , 就 会 开 启 页 机 制 , 0x00000000 地 址 空 间 就 会 转 换 为 0xC0000000,再使用一个绝对跳转指令跳转到 0xC0000000 去执行,在此之后程序就运行在 了编译时指定的 0xC0000000 地址空间, 无论是采用相对寻址还是绝对寻址都不会有问题了。
当这段程序被放在 0xC0000000 空间时,开始执行指令 1,然后采用相对寻址的方法就 可以运行到指令 6,在指令 6 执行时也可以使用绝对寻址的方法从 0xC0000014 正确跳转到 指令 8 所在的 0xC000001C 位置,这段代码运行正常。 当这段代码被放在 0x00000000 空间时,开始执行指令 1,然后采用相对寻址的方法就 可 以 运 行 到 指 令 6 , 但 在 指 令 6 执 行 时 使 用 绝 对 寻 址 的 方 法 从 0x00000014 跳 转 到 了 0xC000001C,但 0xC000001C 空间没有代码,这样程序就跑飞了。
� �
�
代码认为它们运行在 0xC0000000。 从我所在位置经过 5 节车厢到达餐车——从当前指令位置经过相对偏移量找到下条指 令。 只要将被编译到 0xC0000000 地址的代码放到 0x00000000 地址开始执行,如果它们只
使用顺序执行或者相对跳转执行方式就可以正常运行, 但如果使用了绝对寻址, 那么程序就 跑飞了。 我们参照下面这段伪代码来说明这个情况。 指令编号 指令 1: 指令 2: 指令 3: 指令 4: 指令 5: 指令 6: 指令 7: 指令 8: 指令功能 顺序执行 顺序执行 相对跳转到指令 5 顺序执行 顺序执行 绝对跳转到指令 8 顺序执行 顺序执行
0xC000001C 0x0C 0xC0000008 0xC0000004 0xC0000000
没有指令
0xC000001C 0xC0000018 0xC0000014 0xC0000010 0xC000000C 0xC0000008 0xC0000004 0xC0000000
在编译、链接的时候,这段程序被告知放在 0xC0000000 地址空间,编译结果为(每条 指令以 4 字节计算) : 指令地址 0x00000000 0x00000004 0x00000008 0x0000000C 0x00000010 0x00000014 0x00000018 0x0000001C 指令编号 指令 1: 指令 2: 指令 3: 指令 4: 指令 5: 指令 6: 指令 7: 指令 8: 指令功能 顺序执行 顺序执行 相对跳转到指令 5 顺序执行 顺序执行 绝对跳转到指令 8 顺序执行 顺序执行 下条指令地址 当前地址+4 当前地址+4 当前地址+8 当前地址+4 当前地址+4 0xC000001C 当前地址+4 当前地址+4
可以看到它最后的 4 位所存储的就是 Rm 寄存器的编号, 共有 2^4=16 种, 对应 R0~R15。 R 寄存器可以存放 32bits 的数据,可以表示全空间地址范围,因此 BX 指令是一种绝对跳转 指令,并且可以跳转到 32 位机的全部地址空间。 BL 是相对跳转指令, BX 是绝对跳转指令,它们虽然都是跳转指令,实现跳转功能, 除了可跳转的距离不一样之外,在某些场合还是有限制的。比如 linux 内核程序编译的基址 是 0xC0000000 ,内核程序认为它们都是在 0xC0000000 以上空间运行的,而内核在进入页 机制之前都是运行在以 0x00000000 为基址的内存空间,编译空间与运行空间不一致这样不 会有问题么?答案当然是不会有问题,否则 linux 怎么会跑起来,这其中就涉及到程序运行 的相对寻址和绝对寻址的问题了。 我们知道程序分为顺序执行和跳转执行, 顺序执行就是一条指令执行完再去执行它下面 的一条指令,而跳转又分为相对跳转和绝对跳转,正如上述的 BL 和 BX 。顺序执行和相对 跳转执行都是在当前指令的基础上加上相对的偏移量找到下条指令的, 而绝对跳转则是需要 找到实实在在的地址。 我们先来看一个例子,然后再说明上述情况是怎么实现的。 比如说我坐火车从沈阳到大连,我在 2 号车厢,餐车在 7 号车厢, � � � 如果火车停在沈阳站还没开的时候,我要去餐车,我只要走过 5 节车厢就可以到了。 如果火车已经到达大连了,那么我还是只要经过 5 节车厢就可以到餐车了。 如果火车已经到达大连了,但你告诉我说火车还停在沈阳,那么我还是只需要经过 5 节车厢就可以到餐车了。 上面这 3 种情况都是使用了相对地址,无需知道火车所处的绝对地址。 其中第 3 种情况就可以解释编译地址与运行地址不一致的问题。 火车已经到达大连——代码实际运行在 0x00000000 地址。 你告诉我说火车还停在沈阳,我就认为火车停在沈阳 ——代码被编译到 0xC0000000,
更多内容请访问/ifreecoding
接上一篇“从 ARM 汇编指令机器码解释一些问题” 当程序的编译地址与运行地址不一致时,使用相对跳转指令和绝对跳转指令就需要注 意了,本文档将讲述其中原因。 另有一种 B 指令是 BX,它的用法是 BX Rm 其中 Rm 是通用寄存器,例如 BX R0,它的作用是跳转到 R0 中所存储的地址,它的指 令格式如下
指令 8 指令 7 指令 6 指令 5 指令 4 指令 3 指令 2 指令 1
…… …… ……
…… …… ……
0x0000001C 0x00000018 0x00000014 0x00000010 0x0000000C 0x00000008 0x00000004 0x00000000
指令 8 指令 7 指令 6 指令 5 指令 4 指令 3 指令 2 指令 1