精华内容
下载资源
问答
  • 控制转移指令
    2021-11-30 08:50:45

    前言:公号 「编程有料」后台回复 “大礼包” 即可获取近1000本助力你编程之路的电子书

    控制转移指令用来控制程序的执行顺序,用于实现分支、循环、过程调用/返回、中断调用/返回等程序结构。

    CS:IP 总是指向下一条即将执行的指令的地址,通过改变lP 和CS 的值,可以改变程序的执行顺序,但程序中不能使用MOV 指令直接改变CS 和IP 的值,只能通过控制转移指令实现。

    常见的控制转移指令

    1,无条件转移指令JMP

    格式:JMP d

    功能:程序无条件转移到目标地址d 去执行

    说明:目标地址d 常常用标号表示。

    2,子程序(过程)调用指令CALL

    格式:CALL d

    功能:程序无条件转移到子程序(过程)地址d 去执行并保护断点地址。

    3,子程序(过程)返回指令RET

    格式: RET
    RET n
    功能:无条件从子程序返回。

    4,条件转移指令

    格式:J条件 标号

    功能:若满足条件,则程序转移到标号地址去执行,否则继续执行下一条指令
    说明:条件转移指令是以标志位的状态,或者是以标志位的逻辑运算结果作为转移依据的。

    • (1)无符号数

      JA 标号 ;两数比较,高于则转移(JNBE)

      JNA 标号 ;两数比较,不高于则转移(JBE)

      JB 标号 ;两数比较,低于则转移(JNAE)

      JNB 标号 ;两数比较,不低于则转移(JAE)

      功能:比较两个无符号数,并根据比较结果转移

    • (2)有符号数

      JG 标号 ;两数比较,高于则转移(JNLE)

      JNG 标号 ;两数比较,不高于则转移(JLE)

      JL 标号 ;两数比较,低于则转移(JNGE)

      JNL 标号 ;两数比较,不低于则转移(JGE)

      功能:比较两个有符号数,并根据比较结果转移

    一个例子辅助理解并学着应用:

    例:假设AL、BL中存放的是无符号的数。
    如果AL>BL,将AL乘以4;
    如果AL<BL,将AL高两位置1;
    如果AL=BL,将AL按位取反。编写指令序列实现上述要求。
    //程序如下:
    	CMP AL,BL
    	JB A1
    	JZ A2
    	MOV CL,2
    	SHL AL,CL
    	JMP A3
    A1:  OR AL,110000000B
    	JMP A3
    A2:	NOT AL
    A3: ....
    
    

    5、循环指令 LOOP

    格式:LOOP 标号

    功能:将CX←CX一1,若CX≠0 则转到标号地址去执行,否则执行下一条指令
    说明:LOOP指令相当于下面两条指令的组合:
    DEC CX
    JNZ 标号

    LOOP 指令通常放在循环体末尾。

    用一个例子感受下:编写指令序列求1-100 的和。

    //当型循环如下:(对比c语言的当循环写出)
    	MOV CX,1
    	MOV AX,0
    A1:  CMP CX,100
    	JA A2	;高于则转移
    	ADD AX,CX
    	INC CX
    	JMP A1
    A2:  ...
    
    
    更多相关内容
  • 控制转移指令

    2021-04-04 11:34:33
    (1) 无条件转移和过程调用指令 ① JMP ② CALL ③ RET (2) 循环控制指令 ① LOOP 循环指令 (LOOP) LOOP ② LOOPE / LOOPZ 相等或结果为0时循环 (Loop If Equal / Zero) LOOPE LOOPZ ③ LOOPNE / LOOPNZ 不相等...

    1. 无条件转移指令

    ① JMP 无条件转移指令 (Jump)

    JMP 目的
    

    (1)功能:使程序无条件地转移到指令中地目的地址去执行。

    (2)工作特点:

    • 段间直接远转移。

    段内转移,近转移:转移地范围在 − 2 7 -2^{7} 27 ~ 2 7 2^{7} 27个字节之间
    段间转移,远转移:转移地范围在 − 2 15 -2^{15} 215 ~ 2 15 2^{15} 215个字节之间
    直接转移:指令码直接给出转移的目的地址,目的操作数用一个标号表示。
    间接转移:目标地址包含在某个16位寄存器或存储单元中,CPU需根据寄存器或存储器寻址方式,间接求出转移地址。

    ② CALL 过程调用指令 (Call)

    CALL 过程名
    

    (1)功能

    • 第一步,返回地址。将紧跟在CALL指令后的一条指令的地址推入堆栈。
    • 第二步,转到子程序入口地址去执行相应的子程序。

    (2)工作特点

    • 寻找入口地址的方法与JMP指令类似。

    过程:为了实现某种特定的功能而独立编写的程序块。
    过程嵌套:在过程运行中有趣调用另一个过程。
    进过程调用:指令CALL和被调用的过程在同一代码段中。
    原过程调用:指令CALL和被调用的过程不在同一代码段中。

    ③ RET 返回指令 (Return)

    RET
    

    (1)功能:从栈中弹出返回地址,使程序返回主程序继续执行。

    (2)工作特点:

    • 近过程返回,从栈中弹出一个字→IP,并且使
    • 远过程返回,先从栈中抬出一个字→IP,并且使SP←SP + 2;再从栈中弹出一个字→

    2. 条件转移指令

    根据上一条指令执行后,CPU设置的状态标志位作为判别测试条件来决定是否转移。

    条件操作符 标号

    (1) 直接标志转移指令

    指令助记符测试条件指令功能
    JCCF = 1有进位转移
    JNCCF = 0无进位转移
    JZ/JEZF= 1结果为零/相等转移
    JNZ/JNEZF = 0结果不为零/不相等转移
    JSSF=1符号位负转移
    JNSSF =0符号为正转移
    JOOF =1溢出
    JNOOF = 0无溢出
    JP/JPEPF =1奇偶位为1/为偶转移
    JNP/JPOPF =0奇偶位为0/为奇转移

    (2) 间接标志转移指令

    指令助记符测试条件指令功能
    JA/JNBE
    JAE/JNB
    JB/JNAE
    JBE/JNA
    JG/JNLE
    JGE/JNL
    JL/JNGE
    JLE/JNG

    3. 循环控制指令


    不影响任何标志。


    ① LOOP 循环指令 (LOOP)

    LOOP 短标号
    

    (1)功能:控制重复执行一系列指令。

    (2)工作特点

    • 每循环一次,CX自动减1
    • CX ≠ 0时,继续循环。
    • CX = 0时,结束循环,执行LOOP之后的那条指令。

    (3)要求

    • 指令执行前先将重复次数放入CX寄存器

    ② LOOPE / LOOPZ 相等或结果为0时循环 (Loop If Equal / Zero)

    LOOPE
    LOOPZ
    

    (1)功能

    • LOOPE:相等时循环。
    • LOOPZ:结果为0时循环。

    (2)工作特点

    • 每循环一次,CX自动减1
    • CX ≠ 0 和 ZF = 1,转到指令所指定的标号后重复执行。
    • CX = 0 或 ZF = 0,退出循环,执行LOOPZ/LOOPE后的那条指令。

    ③ LOOPNE / LOOPNZ 不相等或结果不为0时循环 (Loop If Not Equal / Zero)

    LOOPNE
    LOOPNZ
    

    (1)功能

    • LOOPNE:不相等时循环。
    • LOOPNZ:结果不为0时循环。

    (2)工作特点

    • 每循环一次,CX自动减1
    • CX ≠ 0 和 ZF = 0,转到指令所指定的标号后重复执行。
    • CX = 0 或 ZF = 1,退出循环,执行LOOPZ/LOOPE后的那条指令。

    ④ JCXZ 若CX为0时跳转 (Jump If CX )

    JXCZ
    

    (1)功能

    (2)工作特点

    • 不对CX寄存器进行自动减1。
    • CX = 0,则转换到指令中标号所指定的地址处。
    • CX ≠ 0 ,往下继续执行。

    3. 中断指令

    参看

    展开全文
  • 新手必看的单片机控制转移指令
  • 此类指令参入的源操作数和目的操作数有 #data/A/Rn/@Ri/direct 五个,其不同组合,共有 15 条指令
  • 控制转移指令,指令包括:JMP,JCC,JCXZ,LOOP,LOOPZ,LOOPNZ,LOOPNE,CALL,RET,INT

    指令包括 JMP,JCC,JCXZ,LOOP,LOOPZ,LOOPNZ,LOOPNE,CALL,RET,INT

    目录

    无条件转移指令JMP

    条件转移指令JCC

    计数器CX为0跳转指令 JCXZ

    循环指令LOOP,LOOPZ,LOOPNZ,LOOPNE

    子程序跳转指令 CALL

    子程序返回指令RET

    中断指令INT


    无条件转移指令JMP

    作用:跳转到对应的指令地址

    ;使用格式
    jmp label    ;IP<-IP+位移量
    jmp reg/mem    ;IP<-reg/mem reg以及mem都需要是16位
    jmp far ptr label    ;CS=label的段地址,IP=label的偏移地址
    jmp far ptr mem    ;CS=[mem+2],IP=[mem]

    示例:

    label:
          ...
        jmp label
    ;此时往上跳,则位移量为负数
    mov ax,4
    jmp ax    ;ip<-4
    ;-------------
    mov word ptr [bx],0
    mov word ptr [bx+2],1500
    jmp far ptr [bx]    ;CS = 1500 , IP = 0

    当指令只需要在当前代码段范围转移时(+-32KB),不需要更改CS地址,只需要修改IP地址

    实际编程时,汇编程序会根据目标地址的距离,自动处理成短转移/近转移/远转移

    程序员可用操作符short / near ptr /far ptr强制执行

    条件转移指令JCC

    作用:根据运算结果跳转到对应的指令地址

    需要的时候查一下就好,不需要强制记住

    JCC 指令 - Sunshine - 博客园 (cnblogs.com)

    JCC指令 - 极客编程 - 博客园 (cnblogs.com)

    计数器CX为0跳转指令 JCXZ

    cx寄存器通常在程序中用作计数器,JCXZ指令用来判断计数是否为0

    ;使用格式
    jcxz label ;cx=0 , 发生转移:IP<-IP+8位的位移量
               ;cx!=0,顺序执行

    循环指令LOOP,LOOPZ,LOOPNZ,LOOPNE

    LOOP label    ;cx<-cx-1
                  ;cx!=0,循环到标号label
    LOOPZ label    ;cx<-cx-1
                    ;cx!=0且ZF=1,循环到标号label
    LOOPNZ label    ;cx<-cx-1
                    ;CX!=0且ZF=0,循环到标号label

    示例:

    mov cx,count    ;设置循环次数
        mov si,offset string
        xor bx,bx    ;bx清0,用于记录空格数
        mov al,20h
    again: cmp al,es:[si]
            jnz next    ;zf=0,非空格,转移
            inc bx    ;zf=1,是空格,个数加1
    next inc si
        loop again    ;字符个数减1,不为0就继续循环

    子程序跳转指令 CALL

    子程序:子程序是完成特定共功能的一段程序,当主程序(调用程序)需要执行这个功能时,采用CALL调用指令转移到该子程序的起始处执行,当运行完子程序功能后,采用RET返回指令回到主程序继续执行

    ;使用格式
    CALL label
    CALL reg/mem    ;SP<-SP-2,SS:[SP]<-IP, jmp labelreg/mem
    call far ptr label
    call ffar ptr mem    ;SP<-SP-2,SS:[SP]<-IP
                         ;SP<-SP-2,SS:[SP]<CS

    call指令其实是做了两件事,执行到CALL时先将CALL指令的下一条指令的IP入栈,在JMP到指定的函数的地址处

    子程序返回指令RET

    ;使用格式
    RET(或者RETN)    ;无参数段内返回
    RET(或者RETN) i16   ;有参数段内返回
    RETF    ;无参数段间返回
    RETF i16 ;有参数段间返回
    

    段内返回时需要出栈        ip<-ss:[sp],sp<-sp-+2

    段间返回时需要出栈         ip<-ss:[sp],sp<-sp+2 ; cs<-ss:[sp],sp<-sp+2

    带参数则在最后 sp<-sp+i16

    注意call far ptr 需要与retf配合使用

    中断指令INT

    作用:改变程序的执行顺序

    ;使用格式 
    INT i8    ;8位数据

    8086的中断:

    8086可以管理256个中断,各种中断用一个向量编号来区别,上述的i8即代表一个中断标号

    除法错中断:执行除法指令,结果溢出产生的0号中断

    指令中断:执行中断调用指令INT i8产生的i8号中断

    断点中断:用于断点调试(INT 3)的3号中断(debug时的每次执行一条语句)

    溢出中断:执行溢出中断指令 OF=1 产生的4号中断

    单步中断:TF=1在每条指令执行后产生的1号中断

    展开全文
  • RV32I的控制转移指令可以分为无条件跳转(unconditional jumps)和条件分支(conditional branches)。其中,无条件跳转(unconditional jumps)包含JAL和JALR;条件分支(conditional branches)包含BEQ、BNE、BLT、...

    RV32I的控制转移指令可以分为无条件跳转(unconditional jumps)和条件分支(conditional branches)。其中,无条件跳转(unconditional jumps)包含JAL和JALR;条件分支(conditional branches)包含BEQ、BNE、BLT、BLTU、BGE和BGEU。这些控制转移指令会根据指令所带的立即数(imm)去计算跳转地址的偏移量,而这个偏移量的计算在这里有两种方式。

    第一种偏移量计算方式:实际偏移量 = 立即数(imm)* 2

    除了JALR之外的所有RV32I的控制转移指令,即:JAL、BEQ、BNE、BLT、BLTU、BGE和BGEU,都采用这种计算方式。在RV32I的规范中可以找到对应的内容。

    JAL 规范P20

    JAL 规范P21

    条件分支(BEQ、BNE、BLT、BLTU、BGE和BGEU) 规范P22

    这些指令在规范中都提到,立即数(imm)表达的是乘以2byte的偏移量,又因为RISCV的地址是byte地址,所以通过立即数(imm)来取偏移量的时候,就需要对立即数(imm)乘以2。

    实际例子1

    《COMPUTER ORGANIZATION AND DESIGN(RISC-V EDITION)》 P115

    这里的偏移量是十进制的2000,那么对应的立即数(imm)是1000,所以指令中的立即数(imm)是1111101000,=2(10)- 1 - 2(4)- 2(2)- 2(1)- 1 = 1000.

    实际例子2

    《COMPUTER ORGANIZATION AND DESIGN(RISC-V EDITION)》 P116-117

    以bne指令为例,它要跳转到最后的Exit,对应到具体的地址就是80024,而bne的指令位置是80012,将80012中的bne指令中的立即数(imm)按照指令格式拼接起来,实际上立即数是0110,也就是6。6 * 2 + 80012 = 80024。

    根本原因

    这些指令通过以2byte作为立即数(imm)的基本单位来计算偏移量,是为了达到通过有限的立即数(imm)可以表达更大的偏移量。那么为什么以2byte(halfword)来作为单位,不干脆直接以4byte(word)作为基本单位?这是因为RISCV的C扩展,即压缩指令扩展,是16位的。在这种情况下,只能选择2byte(halfword)来作为单位,用4byte(word)作为单位会导致有些指令的地址无法被跳转到。

    《COMPUTER ORGANIZATION AND DESIGN(RISC-V EDITION)》 P116中有相关的讲解:

    第二种偏移量计算方式:实际偏移量 = 立即数(imm)

    采用这种计算方式的RV32I的控制转移指令,只有JALR指令。RV32I的规范中,有专门提到:

    规范 P21

    这里专门提到了12位的imm直接加上rs1,就可以获取目标地址。同时,规范中也专门用一段话来讲这个问题。

    规范 P21

    总结

    在对RV32I控制转移指令的偏移量计算问题进行分析之后,将这些指令按照类型进行分类,可以得到如下:

    1. JAL J类型
    2. BEQ、BNE、BLT、BLTU、BGE和BGEU B类型
    3. JALR I 类型

    所以,我们也可以将这个计算按照指令类型进行划分,J类型和B类型的指令是需要对立即数(imm)乘以2来计算实际偏移量,而I类型的指令则不需要。

    RV64I是在RV32I的基础之上直接使用控制转移指令的,所以这个计算问题在RV64I中也同样存在。

     

    注:RISCV规范指的是

    展开全文
  • 的指令系统控制转移指令PPT学习教案.pptx
  • 控制转移指令1.1 条件跳转指令1.2 比较条件跳转指令1.3 多条件分支跳转指令1.4 无条件跳转指令 1.控制转移指令 控制转移指令分为如下图所示的5种,其中比较指令在算术指令中描述过。 1.1 条件跳转指令 条件跳转...
  • 微型计算机原理与接口技术:3控制转移指令.ppt
  • 微机原理与应用:第十四讲 控制转移指令.ppt
  • 51单片机之控制转移指令SJMP、LJMP等

    万次阅读 多人点赞 2019-05-31 23:49:49
    文章目录前言一、无条件转移指令LJMP addr16AJMP addr11SJMP relJMP @A + DPTR关于SJMP、AJMP、LJMP的选择二、条件转移指令JZ rel 前言 控制指令是将程序跳转到某个指定的地址,在顺序执行 控制指令是通过修改PC的...
  • 目录一、控制转移指令的概述二、控制转移指令三、控制转移指令示例 一、控制转移指令的概述 控制转移指令可以让Java虚拟机有条件或无条件地从指定的位置指令而不是控制转移指令的下一条指令继续执行程序,从概念...
  • 功能:实现跳转 当DR=SR时,则IP+OFFSET→ PC; 当DR时,则ADDR→ PC; 否则执行下条汇编指令。(注:OFFSET为位移量;ADDR为内存单元地址)
  • 汇编之控制转移指令

    千次阅读 2020-10-21 21:37:18
    汇编之控制转移指令前言 前言
  • 汇编语言控制转移指令asm文件,希望跟大家共享,自己编的哦~
  • [汇编]8086指令系统---控制转移指令

    千次阅读 2013-11-18 22:32:50
    [汇编]8086指令系统---控制转移指令(一) 控制转移指令通过改变CS:IP来控制程序的执行流程。这类指令包括无条件转移指令、条件转移指令、循环指令、子程序调用和返回指令以及中断和中断返回指令。    ⑴ 无条件...
  • 控制转移指令用于控制程序的流向,所控制的范围即为程序存储器区间,MCS-51系列单片机的控制转移指令相对丰富,有可对64kB程序空间地址单元进行访问的长调用、长转移指令,也有可对2kB字节进行访问的绝对调用和绝对...
  • 51汇编之控制转移指令
  • 汇编语言——控制转移指令

    千次阅读 2019-07-14 14:32:37
    控制转移类指令用于实现分支、循环、过程等程序结构,是仅次于传送指令的最常用指令 可以修改IP,或同时修改CS和IP的指令统称为转移指令。概括的讲,转移指令就是可以控制CPU执行内存中某处代码的指令 1、无条件...
  • 在csapp中的代码优化部分,讲到了程序设计中条件数据传送和条件控制转移指令的异同,在这里分析一下 int compare(int a, int b) { if(a>b) { return a; } else return b; } int compare1(int a, int b){ ...
  • 微机原理--控制转移指令

    千次阅读 2019-11-01 13:37:21
    转移指令 1.JMP(unconditional jump)无条件转移 程序转移到目的操作数指定的地址执行,不需要满足任何条件. 操作数可以是标号、立即数,也可以是寄存器操作数或存储器操作数 Short jump 段内直接短转移 ...
  • 文章目录
  • 依照某种特定条件转移,若满足,则目的地址在下一条指令的起始地址为中心的。也可写成目的地址的标号地址,此时,跳转偏移量由计算机直接计算。该指令不影响任一个操作数的内容。
  • 8086CPU指令系统——控制转移指令

    千次阅读 2019-10-01 19:00:47
    控制转移(Control ...8086提供了以下控制转移指令: 调用与返回指令、无条件转移指令、条件转移指令、循环控制指令、中断指令。 一、无条件转移指令 二、条件转移指令 三、循环控制指令 四、中断指令 ...
  • 51单片机控制转移指令的一些理解

    千次阅读 2012-09-26 15:40:17
    控制转移指令的功能是改变指令的执行顺序,转到指令的指示的新的PC地址执行。  MCS-51单片机的控制转移指令有以下几钟类型: 无条件转移:无需判断,执行该指令就转移到目的地址。条件转移:需判断标志位是否...
  • 3-07 控制转移指令.zip

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 66,974
精华内容 26,789
关键字:

控制转移指令