精华内容
下载资源
问答
  • 循环转移指令
    2021-06-19 10:13:45

    版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如果有侵权请立即联系:55525090@qq.com,我们立即下架或删除。

    简介:3.3.5 程序控制指令

    程序控制指令又称为控制转移指令,包括:转移指令、循环控制指令、过程调用指令和

    中断指令 4 类。转移指令又分为无条件转移指令和条件转移指令。

    1.无条件转移指令 JMP

    计算机程序的执行完全按照 CS:IP 的指向执行指令。通常情况下 CS 保持不变,IP 自动

    增量,程序就按照指令的先后顺序执行。无条件转移指令会修改 CS 和 IP 的值,使程序跳

    转到另一个位置去执行,改变指令的执行顺序。

    根据程序的转移范围可分为段内转移和段间转移。在同一段的范围之内进行转移,只需

    要修改 IP 的值,称为段内转移。如果 CS 的值被修改,意味着程序将转移到另外的段去执行,

    这称为段间转移。段间转移不仅修改段基址 CS 的值,还修改 IP 的值。

    JMP 指令不影响标志位。

    (1)段内转移

    指令格式: JMP OPRD

    功能:段内转移,IP IP+位移量,或给 IP 赋值。

    说明:根据 OPRD 的类型又分为段内直接转移和段内间接转移。指令不影响标志位。

    例如:

    JMP LABEL ;LABEL 为指令标号

    JMP SHORT LABEL

    JMP NEAR LABEL

    JMP BX

    JMP WORD PTR[BX+DI]

    JMP LABEL,程序转移到 LABEL 指明的指令处继续执行。指令中 LABEL 通常为标号,

    例如【例题 3-17】程序段中的 FOUND 和 DONE。

    JMP SHORT LABEL,程序转移到 LABEL 指明的指令处继续执行。SHORT 为属性说明符,

    说明转移范围,以当前 IP 为中心,转移范围-128~+127。

    JMP NEAR LABEL,程序转移到 LABEL 指明的指令处继续执行。NEAR 为属性说明符,

    说明转移范围,以当前 IP 为中心,转移范围-32768~+32767。

    说明:在编程时 NEAR 与 SHORT 通常省略,编译时由汇编程序自己计算。如果用了

    NEAR 或 SHORT,在编译时有时会提示不正确的属性限制。所以 JMP LABEL 是最常见

    的形式。

    由于 LABEL 对应一条指令,是这条指令的符号地址,所以以上三种 JMP 形式又称为

    段内直接转移。这些指令在编译时,汇编程序会计算出它的下一条指令到 LABEL 指明的指

    令之间的位移量(相距多少字节),将这个位移量编译为 JMP 的操作数。指令执行时 IP 加

    上这个位移量(JMP 指令的功能),IP 的值被修改,使得下一条要执行的指令指向 LABEL。

    JMP BX,将 BX 的值传送给 IP,程序转移到 CS:IP 处继续执行。操作数可以是所有 16 位

    通用寄存器。

    JMP WORD PTR[BX+DI],从[BX+DI]指明的内存区域连续取出两个字节传送给 IP,程序转

    移到 CS:IP 处继续执行。操作数可以采用各种寻址方式。

    以上两种 JMP 形式又称为段内间接转移,编程时要注意操作数必须是 16 位。

    【例题 3-17】

    MOV DI, 0

    JMP DONE

    FOUND: DEC DI

    DONE: MOV POINT, DI

    MOV AX,1234H

    JMP CX ;IP=2000H,程序跳转到段内偏移地址为 2000H 处

    (2)段间转移

    指令格式: JMP OPRD

    功能:段间转移,IP←OPRD 的段内偏移地址,CS←OPRD 所在段的段基址。

    说明:根据 OPRD 的类型又分为段间直接转移和段间间接转移。指令不影响标志位。

    例如:

    JMP FAR LABEL

    JMP DWORD PTR [BX+DI]

    JMP FAR LABEL ,程序转移到 LABEL 指明的指令处继续执行,LABEL 为标号。FAR 是

    相对于 NEAR 的属性说明符,FAR 说明标号 LABEL 在另外的代码段,与 JMP 指

    令本身不在同一段。这条指令执行的操作是 IP←LABEL 的偏移地址,CS←LABEL

    所在段的段基址,程序转移到 CS:IP 处继续执行。这种 JMP 形式又称为段间直接转

    移。

    JMP DWORD PTR[BX+DI],从 [BX+DI]指明的内存区域连续取出 4 个字节,前两个字节(低

    地址)传送给 IP,后两个字节送给 CS,程序转移到 CS:IP 处继续执行。操作数属

    于存储器操作数,可以采用各种存储器的寻址方式... 更多>>

    更多相关内容
  • 【汇编语言】转移指令&循环指令

    千次阅读 2021-05-01 11:46:41
    转移指令 一、无条件转移指令 (1)JMP指令概述 (2)JMP指令类型 1.段内转移、相对寻址 2.段内转移、间接寻址 3.段间转移、直接寻址 4.段间转移、间接寻址 (3)条件转移指令的使用 1.标号的地址属性 2.控制转移 二、条件...

    转移指令

    在这里插入图片描述

    一、无条件转移指令

    (1)JMP指令概述

    JMP 称为无条件转移 (Jump) ,就是无任何先决条件就能使程序改变执行顺序。

    • 执行无条件转移指 JMP, 就可以使程序转到指定的目标地址处,从目标地址处开始执行指令。
    • JMP 指令相当于高级语言的 GOTO 语句 结构化程序设计要求尽量避免使用GOTO 语句,但指令系统决不能缺少 JMP ,汇编语言编程也不可避免地要使用 JMP 指令。

    (2)JMP指令类型

    JMP 根据目标地址的转移范围和寻址方式,可以分成4种类型。

    • MASM 汇编程序会根据存储模型和目标地址等信息自动识别是段内转移还是段间转移,也能够根据位移 大小自动形成短转移或近转移指令。
    • 32 位保护方式使用平展存储模型,不允许应用程序进行段间转移

    1.段内转移、相对寻址

    JMP label 	;EIP=EIP+位移量
    

    段内相对转移 JMP指令 利用标号 (LABEL) 指明目标地址。

    • 当向地址增大方向转移时,位移量为正;向地址减小方向转移时,位移量为负(补码表示)。
    • EIP 指向的偏移地址改变,段寄存器 CS 的内容不变

    2.段内转移、间接寻址

    JMP r32/rl6		 	; EIP = r32/r16 , 寄存器间接寻址
    JMP m32/m16 		; EIP = m32/m16 , 存储器间接寻址
    

    段内间接转移 JMP 32 位通用寄存器或主存单元内容(线性地址空间)或者 16位通用寄存器或主存单元内容(实地址存储模型)送入 EIP 寄存器,作为新的指令指针(即偏移地址),但不修改 CS 寄存器的内容。

    3.段间转移、直接寻址

    JMP label 			; EIP = label 的偏移地址,CS= label 的段选择器
    

    段间直接转移 JMP 是将标号所在的段选择器作为新的 CS 值,标号在该段内的偏移地址作为新的 ElP 这样,程序跳转到新的代码段执行.

    4.段间转移、间接寻址

    JMP m48/m32 		;EIP=m48/m32 , CS =m48+4/m32+2
    
    • 在32位线性地址空间用一个字存储单元 (48 位,使用了符号m48) 表示要跳转的目标地址,将低双字送 EIP 寄存器 CS 寄存器(小端方式);
    • 在16位实地址存储模型中,用一个双字存储单元表示要跳转的目标地址,将低字送 EIP 寄存器、高字送入CS 寄存器(小端方式)。

    (3)条件转移指令的使用

    1.标号的地址属性

    使用offset + 标号 获取标号所在指令的地址

    • 指令寄存器间接寻址

      mov eax,offset label
      jmp eax
      
    • 指令存储器间接寻址

      mov eax,offset label
      mov nvar,eax
      jmp nvar
      

    2.控制转移

    汇编程序提供了短转移SHORT 、近转移 NEAR PTR 和远转移 FAR PTR 操作符,强制转换一个标号、段名或子程序名的类型,形成相应的控制转移。

    jmp near ptr label		;强制生成相对寻址的近转移
    

    二、条件转移指令

    (1)JCC指令概述

    条件转移指令 Jcc 根据指定的条件确定程序是否发生转移,条件满足,发生转移、跳转到 LABEL 位置,即 EIP=EIP+ 位移量。否则,顺序执行下条指令。

    • 语法格式:

      Jcc label
      

      label表示目标地址采用段内相对寻址

    • 流程图表示
      在这里插入图片描述

    (2)条件转移指令分类

    条件转移指令中的条件是由状态标志决定,共16条指令,分成两类。
    在这里插入图片描述

    ①单个标志状态作为条件

    5个状态标志ZF、CF、SF、OF和PF的10种状态

    1.利用零位标志ZF的条件转移指令
    • 判断条件:运算结果为0、两数相等(标志ZF=1)

      JZ label ;Jump if Zero
      
      JE label ;Jump if Equal
      
    • 判断条件:结果不为0、不相等(标志ZF=0)

      JNZ label ;Jump if Not Zero
      
      JNE label ;Jump if Not Equal
      
    2.利用进位标志CF的条件转移指令
    • 判断条件:运算结果有进位(借位)(标志CF=1)

      JC label ;Jump if Carry
      
    • 判断条件:结果没有进位(借位)(标志CF=0)

      JNC label ;Jump if Not Carry
      
    3.利用溢出标志OF的条件转移指令
    • 判断条件:运算结果有溢出(标志OF=1)

      JO label ;Jump if Overflow
      
    • 判断条件:结果没有溢出(标志OF=0)

      JNO label ;Jump if Not Overflow
      
    4.利用符号标志SF的条件转移指令
    • 判断条件:运算结果是负、最高位为1(标志SF=1)

      JS label ;Jump if Sign
      
    • 判断条件:结果是正、最高位为0(标志SF=0)

      JNS label ;Jump if Not Sign
      
    5.利用奇偶标志PF的条件转移指令
    • 判断条件:低8位结果中1的个数为偶或0(标志PF=1)

      JP label ;Jump if Parity
      
      JPE label ;Jump if Parity Even
      
    • 判断条件:低8位结果中1的个数为奇(标志PF=0)

      JNP label ;Jump if Not Parity
      
      JPO label ;Jump if Parity Odd
      

    ②两数大小关系作为条件

    1.比较无符号整数大小

    4种情况:低于、不低于、低于等于、高于
    无符号数大小用高(Above)、低(Below)助记符

    • 判断条件:低于、不高于等于(标志CF=1)

      JB ;Jump if Below
      
      JNAE ;Jump if Not Above or Equal
      
    • 判断条件:不低于、高于等于(标志CF=0)

      JNB ;Jump if Not Below
      
      JAE ;Jump if Above or Equal
      
    • 判断条件:低于等于、不高于(标志CF=1或ZF=1)

      JBE ;Jump if Below or Equal
      
      JNA ;Jump if Not Above
      
    • 判断条件:不低于等于、高于(标志CF=0且ZF=0)

      JNBE ;Jump if Not Below or Equal
      
      JA ;Jump if Above
      
    2.比较有符号整数大小

    4种情况:小于、不小于、小于等于、大于
    有符号数大小用大(Greater)、小(Less)助记符

    • 判断条件:小于、不大于等于(标志SF≠OF)

      JL ;Jump if Less
      
      JNGE ;Jump if Not Greater or Equal
      
    • 判断条件:不小于、大于等于(标志SF=OF)

      JNL ;Jump if Not Less
      
      JGE ;Jump if Greater or Equal
      
    • 判断条件:小于等于、不大于(标志SF≠OF或ZF=1)

      JLE ;Jump if Less or Equal
      
      JNG ;Jump if Not Greater
      
    • 判断条件:不小于等于、大于(标志SF=OF且ZF=0)

      JNLE ;Jump if Not Less or Equal
      
      JG ;Jump if Greater
      

    (3)产生条件的指令

    1.比较指令CMP

    进行减法运算,用于判断两个数据大小、是否相等

    将目的操作数减去源操作数,差值不回送目的操作数,按照减法结果影响状态标志

    CMP reg,imm/reg/mem ;reg-imm/reg/mem
    
    CMP mem,imm/reg ;mem-imm/reg
    
    • 根据标志状态获知两个操作数的大小关系
    • 给条件转移等指令使用其形成的状态标志

    2.测试指令TEST

    进行逻辑与运算,用于判断某位为0或为1等

    按位进行逻辑与运算,不返回逻辑与结果

    TEST reg,imm/reg/mem ;reg ^ imm/reg/mem
    
    TEST mem,imm/reg ;mem ^ imm/reg
    
    • TEST指令像AND指令一样来设置状态标志
    • 常用于检测一些条件是否满足,一般后跟条件转移指令,目的是利用测试条件转向不同的分支

    3.其他指令(能够影响状态标志的指令)

    加减运算指令、逻辑运算指令、移位指令等

    循环指令

    循环条件判断可以使用条件转移指 ,同时 IA-32 处理器针对个数控制的循环设计有若干条指令, 要是 LOOP 指令和 JECX 指令。

    一、LOOP指令

    IA-32 处理器 的循环指令是 LOOP,使用 ECX 寄存器作为计数器(在实地址存储模型 使用 CX), 每执行 LOOP, ECX-1。然后判断 ECX 是否为 0: 如果不为 0, 表示循环没有结束,则转移到指定的标号处;如果为 0, 表示循环结束,则顺序执行下一条指令。

    (1)LOOP指令格式

    循环指 LOOP 的格式如下:

    LOOP label
    
    • 功能1:ECX←ECX-1(相当于 DEC ECX
    • 功能2:若ECX≠0,转移到LABEL, 否则,顺序执行(相当于 JNZ label

    相当于

    DEC ECX 
    JNZ label 
    

    寄存器ECX是默认的计数器,目标地址采用相对短转移

    (2)LOOP指令的应用

    LOOP是循环指令,用于实现减量计数的循环控制

    • 典型应用形式:
    		mov ecx,num 	;设置循环的计数初值num
    label: 	… 				;循环体
    		loop label 		;ECX减1,未到0继续循环
    						;到0循环结束,顺序执行
    
    • LOOP指令的循环次数
      循环初值12 2 32 − 1 2^{32}-1 23210
      循环次数12 2 32 − 1 2^{32}-1 2321 2 32 2^{32} 232

    LOOP指令先减1后判断

     		mov ecx,0 		;设置循环的计数初值 
     label: 	loop label 	;ECX减1,未到0继续循环
    

    在这里插入图片描述

    二、JECXZ指令

    LOOP 指令先进行 ECX 操作,然后判断 如果 ECX 等于0 时执行 LOOP 指令,则将循环 2 32 2^{32} 232次。所以,如果数组元素的个数为 0, 本程序将出错,为此,我们可以使用另一条循环指令JECXZ (实地址存储模型是 JCXZ 指令)排除 ECX 等于0 的情况。

    • JECXZ指令格式:

      JECXZ label
      

      ECX=0,转移到label,否则,顺序执行

      • 相当于:
        CMP ECX,0 
        JZ label 
        

    在这里插入图片描述

    展开全文
  • 本文主要介绍了51单片机条件转移指令
  • 文章目录

    程序控制指令

    程序控制类指令的本质是:控制程序的执行方向
    决定程序执行方向的因素:CSIP
    程序控制类指令的操作对象是:IPCS和IP
    控制程序执行方向的方法:

    在这里插入图片描述

    程序控制指令包含4类:转移指令循环控制过程调用中断控制



    一、 转移指令

    转移是通过修改下一条要执行指令的偏移地址段地址和偏移地址实现程序的转移
    分为:

    在这里插入图片描述

    1.1 无条件转移指令 JMP

    分为直接转移间接转移
    分为段内(16位) 和 段间(32位)

    在这里插入图片描述

    直接和间距的区别就是,前者是直接给地址,后者通过寄存器或者其他

    段间和段内的区别就是,前者32位(CS:IP 故32位),后者是16位(就ip,所以16位)

    1.1.1 段内直接

    JMP Label
    Label: 指向下一条代码的地址

    1.1.2 段内间接

    如果我们是通过指令里面的寄存器 或者 存储器操作数给出的目标地址,就称为间接转移。例如:

    MOV BX, 1200H
    JMP BX    //运行完了之后 IP = 1200H,这里 BX 是寄存器操作数
    

    另外一种表现形式:

    MOV BX, 1200   //注意:这里不是 H 
    JMP WORD PTR [BX]  //这样一来,我们把数据段里面 标号为 1200和 1201 的两个单元分别赋给 IP的低位和高位
    

    段内间接例子在这里插入图片描述





    还是以上面的为例,如果我们的 Label 符号是 32 位的地址,那么就表示 段间转移

    同样,段间转移也分为了 段间直接转移段间间接转移
    段间直接转移就是我们在指令里面直接给出 32 位目标地址(CS:IP)
    段间间接转移就是需要通过 32 位的存储器操作数(注意不能是寄存器了)给出目标地址。

    1.1.3 段间直接

    对于段间直接转移,指令格式是:JMP FAR Label(FAR 代表远地址)

    1.1.4 段间间接

    那么对于段间间接转移,我们可以用下面的表述:

    JMP DWORD PTR[BX]    //[BX]指向的是存储器操作数
    

    段间间接例题:

    在这里插入图片描述




    1.2 有条件转移指令 …

    1. 根据单个条件标志的设置情况转移
      在这里插入图片描述
      这种转移指令常常用于适用于测试某一次运算的结果并根据其不同特征产生程序分支不同的处理的情况

    2. 比较两个无符号数,并根据比较的结果转移
      在这里插入图片描述

    3. 比较两个带符号数,并根据比较的结果转移
      在这里插入图片描述

    4. 常用
      在这里插入图片描述




    二、循环转移指令

    循环控制指令有几个要点:

    • 循环范围:以当前 IP 为中心的 -128~ +127的范围内循环
    • 循环次数:循环的次数必须要由 CX 寄存器指定。
    • 循环指令也分为无条件循环 LOOP条件循环指令 LOOPZ/ LOOPNZ

    2.1 无条件循环指令 LOOP

    格式:LOOP Label
    等价于:(这个有点不确定)

    DEC CX
    JNZ 符合地址
    

    循环的条件是:当 CX ≠ 0时。

    在这里插入图片描述

    2.2 条件循环指令 LOOPZ/ LOOPNZ

    功能:先使得 CX -1,再根据 CX 的值以及 ZF 的值去决定是否循环。

    1. LOOPZ(相等则循环):当 CX ≠ 0,且 ZF = 1时循环
    2. LOOPNZ(不相等则循环):当 CX ≠ 0,且 ZF = 0时循环

    因此,条件循环指令前面需要跟能够改变 ZF 状态的指令,用以控制循环




    三、过程调用指令

    过程调用,就是类似于我们在 C++ 里面的主程序中调用子函数一样。
    那么话说回来,我们在刚刚所讨论的转移类指令,是程序运行到某个地方之后,就跳转到另外一段代码,不会再回到原处了。
    但是对于过程调用指令,我们跳转到子程序运行完了之后,是需要回到原来的地方继续执行主程序的。
    用下面的图说明一下
    在这里插入图片描述
    注意:我们执行完子程序返回的位置是原来跳转位置的后一条指令!

    因此,既然需要返回原来的位置,也就不能忘了初心。
    过程调用指令需要保护返回地址(也就是 段基地址 和 偏移地址)。即我们需要把 CS 和 IP 里面的内容压栈。

    3.1 基本格式

    调用指令:CALL <子过程的入口地址>
    返回指令:RET

    分为直接转移间接转移
    分为段内(16位) 和 段间(32位)
    在这里插入图片描述

    3.2 段内 直接/间接 调用例子

    在这里插入图片描述

    3.3 段间 直接/间接 调用例子

    在这里插入图片描述

    3.4 CALL指令执行对堆栈的影响

    在这里插入图片描述




    四、中断控制

    响应中断,即针对某个随机或异常事件执行一段处理程序,称为中断服务程序,本质上是一种特殊的过程调用,且全部是远过程调用。

    指令格式:INT n
    n=0 ~ 255

    执行过程:
    在这里插入图片描述

    中断指令的执行过程示例
    在这里插入图片描述

    中断指令例子

    在这里插入图片描述

    中断返回指令
    格式:IRET
    中断服务程序的最后一条指令,负责恢复断点 、恢复标志寄存器内容

    展开全文
  • 文章目录前言一、转移指令原理1.1 计算机如何识别数据和指令1.2 转移 前言 点赞再看,养成习惯! 关注晓龙oba公众号,获取更多电子书及学习资源。 该系列博文基于王爽老师 <汇编语言 第四版> 一书,需要的同学...

    前言

    点赞再看,养成习惯!
    关注晓龙oba公众号,获取更多电子书及学习资源。

    该系列博文基于王爽老师 <汇编语言 第四版> 一书,需要的同学链接自取:

    链接:https://pan.baidu.com/s/1NAgD1Z15LtK1BuH92xmICA
    提取码:xlzb

    另外书中提到的DosBox软件不想去官网下载的小伙伴也可以自取:

    链接:https://pan.baidu.com/s/1O6PnLb_hN-WUS2avicNpcw
    提取码:xlzb

    最后如果还没有计算机基础的同学,建议先补充下计算机相关的基础知识:

    计算机知识全集

    一、转移指令原理

    1.1 计算机如何识别数据和指令

    让我们先回顾下之前讲过的知识。计算机在组成上分为硬件和软件两部分,这里我们先抛开硬件不谈,计算机的软件本质上就是由指令数据组成。然而无论是指令还是数据在存储到内存器的时候都是二进制串,此时并没有明显的标识告诉计算机这是数据还是指令。比如:
    在这里插入图片描述
    这里我为073F:0100区域插入了三条数据,分别是B8,01,00,而此时CS:IP寄存器的指向刚好是073F:0100,这个时候虽然我们是作为数据录入到的内存单元中,但是计算机却可以将其翻译为mov ax,0001 这个指令。这就涉及到计算机是如何区分数据和指令的了。其实这个问题在之前的博客里我已经提到过很多次,先贴一个之前的文章,想要了解的小伙伴可以看下:

    寄存器详解(可以直接跳到章节2.1)

    这里简单的概括就是只要是CS:IP寄存器指向的内存单元就会被计算机当作是指令进行翻译并处理。

    1.2 转移指令原理

    当我们了解计算机如何区分指令的时候,我们就可以进一步的推断:
    如果一个指令可以修改IP或者同事修改CS和IP地址,那么这个指令就可以使程序转移接下来要执行的指令,因此我们将可以修改CS或IP寄存器值的指令称为转移指令。

    1.3 转移分类

    1.3.1 转移行为分类

    我们可以简单的概括下86CPU中存在的转移行为
    1. 只修改IP的时候我们通常将其称为段内转移,比如:jmp ax
    2. 同时修改CS和IP的指令被称为段间转移,比如:jmp 1000:0
    这里需要说下,由于修改ip寄存器的范围不同,我们又可以将其细分为:短转移和近转移
    短转移IP的修改范围为: -128 ~ 127
    近转移ip的修改范围为: -32768 ~ 32767
    

    1.3.2 转移指令分类

    1. 无条件转移指令(如:jmp)
    2. 条件转移指令
    3. 循环指令(如:loop)
    4. 过程
    5. 中断

    二、操作符详解

    2.1 offset

    操作符offset在汇编语言中是由编译器处理的操作操作符,它的功能是取得标号的偏移地址。

    #按照惯例让我们写个程序演示下
    assume cs:codesg
    
    codesg segment
    start:mov ax, offset start ;  #相当于mov ax,0
         s:mov ax, offset s ; #相当于mov ax,3
    codesg ends 
    end start
    

    运行结果
    在这里插入图片描述
    在这段程序中我们可以看到offset操作符取得了我们设置的标号start和s的偏移地址0和3,因此指令mov ax,offset start 就相当于mov ax,0offset start 就相当于获取start的偏移地址。
    接下来让我们做个小题目练习一下:

    # 现在有一个程序段,需要我们添加两行指令,将s处的一条指令复制到s0处
    
    assume cs:codesg
    codesg segment
    s:  mov ax,bx
        mov si, offset s
    	mov di, offset s0
    	?
    	?
    s0: nop   ;这里声明一下nop是一个占位符,占用一个字节
        nop
    codesg ends
    end s
    

    让我们先来列出一些小问题

    1. offset soffset s0 分别指向了什么地址?
    2. 我们的需求是将s处的指令赋值给s0处,也就是将cs:offset s 的数据赋值给 cs:offset s0
    3. 我们需要复制的地址有多长?也就是mov ax,bx的长度是多少?

    让我们按照顺序进行分析。

    1. 当前的offset s 其实就是等价于 cs:offset s,同理 offset s0 就等价于 cs: offset s0
    2. 那也就是我们将 offset s上面的命令赋值给 offset s0即可
    3. 我们可以借助si,di寄存器实现值的交换
    4. mov ax,bx指令长度为两个字节,即一个字,刚好是ax寄存器的存储上限

    #让我们看一下按照思路实现后的代码
    assume cs:codesg
    codesg segment
    s: mov ax,bx
        mov si, offset s
    	mov di, offset s0
    	mov ax, cs:[si]
    	mov cs:[di],ax
    s0: nop   
        nop
    codesg ends
    end s
    

    运行结果:
    在这里插入图片描述

    2.2 jmp指令

    jmp指令属于无条件转移指令,他可以修改IP寄存器的值或者同事修改CS:IP寄存器的值来实现寄存器指向指令的变更。那么相对的jmp指令需要给出两种明确的信息。

    1. 转移的目的地址
    2. 转移的距离(段间转移,段内短转移,段内近转移)

    不同的给出目的地址的方法和不同的位移位置都对应着有不同的jmp指令格式。

    2.2.1 依据位移进行转移的jmp指令

    指令格式: jmp short 标号(转到标号处执行指令)

    这种格式的jmp指令实现的是段内短转移,他对ip寄存器的修改范围为-128~127,也就是说它可以向前跨跃128个字节或者向后跨越127个字节,jmp中的short符号也表明了其属于短转移。jmp指令中的标号是代码段中的标号,表明了指令想要转移的地址,转移指令结束后,cs:ip应该指向标号处。

    # 比如
     assume  cs:codesg
    codesg segment 
    start: mov ax,0
           jmp short s
    	   add ax,1
    s:     inc ax
    codesg ends
    end start 
    

    实验结果
    结果
    通过实验结果观察我们可以得知,ax寄存器的最终值为1是由于执行了jmp short s操作后,越过了原本的add ax,1 从而直接执行了 inc ax

    2.2.2 跳转原理解析

    我们学习汇编语言的目的其实并不是单纯地通过汇编语言去写一个程序,更多的是想要通过汇编语言去了解计算机软件和硬件之间的关联。就拿刚刚的例子来说,因为执行了jmp short s命令,程序直接越过了add ax,1 ,IP寄存器指向了标号S处的inc ax命令。为了搞懂这其中的奥妙,让我们先看下这几条指令转换为机器指令是什么样子的:

    在这里插入图片描述
    对照机器指令,我们可以看出jmp short s 中的s表示为了inc ax指令的偏移地址 8 ,并将jmp short s 直接转换为了jmp 0008,这一切看似很简单,但是我们可以往下深想:
    在这里插入图片描述
    无论是jmp 0008 亦或是jmp short s两个命令所对应的机器码都是EB03,注意,这个机器指令竟然不包含我们转移的目标地址08,这意味着CPU在执行EB03的机器指令的时候是并不知道我们此时的转移目标地址的。那么CPU是根据什么进行转移的呢?它如何知道目标地址在哪里呢?
    我们来改写下程序:

    assume cs:codesg
    codesg segment
          start: mov ax,0
    	         mov bx,0
    			 jmp short s 
    			 add ax,1
    	 s:      inc ax
    codesg ends
    end start
    

    我们翻译成机器码:
    在这里插入图片描述
    这里我们可以发现,我们的指令inc ax的地址已经更改为了40,但是对应的jmp short s的机器码依旧是EB03,这在侧面的证明了CPU在执行jmp指令的时候并不需要知道转移的目的地址。当然我们知道CPU并不是人工智能,他不具备思考的能力,它只能够处理我们提供给它的信息。所以CPU是如何获取转移的目标地址呢?
    这里让我们简单的回一下CPU执行指令的过程
    1. 从CS:IP指向的内存单元读取数据作为指令,读取的指令进入指令缓冲器
    2. (IP)=(IP)+所读取指令的长度,从而指向下一条指令。
    3. 执行指令,回到第一步

    按照这个逻辑我们来分析下上面这段程序的运行过程

    1. CS = 076A , IP=0000
    2. 加载B80000进入指令缓冲器,IP = IP+3
    3. 执行B80000即mov ax,0000
    4. CS=076A ,IP=0003
    5. 加载BB0000进入指令缓冲器 IP=IP+3
    6. 执行BB0000即mov bx,0000
    7. CS=076A ,IP=0006
    8. 加载EB03进入指令缓冲器,IP=IP+2
    9. 执行EB03即jmp 000B
    10. CS=076A ,IP = 0009

    接下来按照我们的预期,CPU会继续执行CS:IP即076A:0009处命令,此处命令为AX,0001,但是CPU却直接跳过,执行了INC AX。那么计算机是根据什么做到的转移呢?奥秘其实就在指令中的03处。让我们再改下程序:

    assume cs:codesg
    codesg segment
          start: mov ax,0
    	         mov bx,0
    			 jmp short s 
    			 add ax,2
    			 add ax,3 # 新增一行代码
    	 s:      inc ax
    codesg ends
    end start
    

    在这里插入图片描述
    我们比较下上下两个版本代码可以发现两者之间的区别在于在跳转指令后多了一行代码。而我们查看第二版代码的jmp short s指令所对应的机器码会发现其变成了EB06,聪明的小伙伴已经看出了问题的所在。
    虽然CPU无法直接获取目标地址,但是它能够通过诸如EB03或EB06这种指令码中的转移地址长度来判断它的目标地址。其中03,06等表示的就是IP寄存器的位移距离。

    我们可以用生活中的案例来映射CPU获取目标地址的方式。比如我要去一家附近的网红店,那常见的方式就说获取网红店的精准地址,比如:成都市青羊区光华街道115号,那我就可以通过这个精准地址前往饭店。这就是我们说的通过目标偏移地址进行转移。
    还有另外一种方式就是我虽然不知道它的精确地址,但是可以通过询问路人获得前行500米左转再直行300米这种转移信息来进行位移,同样也可以获得目的地。这就是jmp short s中EB03的运行原理。

    2.2.3 依据目的地址进行转移

    刚刚的例子中,我们是依靠的标号进行的段内近转移,而接下来我们要进行一次段间远转移。

    assume cs:codesg
    codesg segment 
    start : mov ax,0
            mov bx,0
    		jmp far ptr s 
    		db 256 dup (0) # db表示double byte ,dup表示重复元素
    	s:  add ax,1
    		inc ax
    codesg ends
    end start
    
    

    按照惯例,让我们来看下机器码:

    在这里插入图片描述
    如图所示,源程序中有两个地方需要我们注意下

    1. db 256 dup (0) 被debug解释为相应的若干条汇编指令。
    2. jmp far ptr s 指令所对应的机器码是: EA 0B 01 BD 0B,和短位移不同,这里面的0B 01 BD 0B不再是位移长度,而是明确的位移地址,BD 0B代表的是段地址,0B 01是偏移地址。

    2.2.4 jmp配合寄存器的使用

    当然我们可以将目标地址存放到寄存器中,这种指令其实我们之前就已经用过了:

    assume cs:codesg 
    codesg segment 
     start: 
           mov ax,1
    	   jmp ax
    codesg ends 
    end start
    

    在这里插入图片描述
    这里的机器码是标记了AX的内存单元,然后将AX内存单元中的值获取出来作为IP的偏移地址。由于之前用过很多次了,就不再赘述了。

    2.2.5 jmp配合内存单元的使用

    jmp配合内存单元的使用分为两种:
    1. 段内转移

    指令格式: jmp word ptr 内存单元地址
    原理很简单,就是将内存单元地址中的值赋予IP寄存器
    2. 段间转移
    指令格式: jmp dword ptr 内存单元地址
    这个原理也很简单高地址处的字赋予CS,低地址处的字赋予IP

    简单的举例:

    assume cs:codesg
    codesg segment
           start:   mov ax,0123H
    	            mov ds:[0],ax
    				mov word ptr ds:[2] ,0 
    				jmp dword ptr ds:[0]
    codesg ends 
    end start 
    

    机器码:
    在这里插入图片描述

    2.3 jcxz指令

    jcxz指令为有条件的转移指令,这里重点说下,所有有条件的转移指令都是短转移 ,即只修改IP寄存器的值。
    指令格式:
    jcxz 标号
    这里也提到了JCXZ是有条件的转移指令。它的条件就是判断CX寄存器此时的值是否为零,若为零则进行转移,若不为零则什么都不做。
    简单举例:

    assume cs:codesg
    codesg segment
    start:
          mov cx,0
    	  mov ax,0
    	  jcxz s
    	  mov ax,2
    s:    inc ax
    codesg ends 
    end start
    

    机器码:
    在这里插入图片描述
    由于是短转移,其原理就是通过该百年IP = ip+ 位移距离实现的。
    有其他语言基础的同学可以理解JCXZ命令等于:

    if(cx == 0){
    jmp 标号;
    }
    

    2.4 loop指令

    我们的老朋友了,loop指令是一个循环指令,所有的循环指令都是短转移。其判断条件也是通过CX寄存器的值进行,每次进行转移则CX寄存器的值减一,直到为零。
    由于我们已经用过很多次了,就不详细举例了。不了解的小伙伴建议看下之前的文章。

    [从零学习汇编语言] - BX寄存器与loop指令

    结语

    今天的内容就到此结束了,有疑问的小伙伴欢迎评论区留言或者私信博主,博主会在第一时间为你解答。
    项目通用架构及工具已上传到gitee仓库,需要的小伙伴们可以自取:
    https://gitee.com/xiaolong-oba/common-base
    屏幕前努力学习的你如果想要持续了解博主最新的学习笔记或收集到的资源,可以关注博主的个人公众号。这里有很多最新的技术领域PDF电子书及好用的软件分享在这里插入图片描述

    码字不易,感到有收获的小伙伴记得要关注博主一键三连,不要当白嫖怪哦~
    如果大家有什么意见和建议请评论区留言或私聊博主,博主会第一时间反馈的哦。

    展开全文
  • 条件转移指令是指在满足一定条件时进行相对转移。如: 判A内容是否为0转移指令 JZ rel JNZ rel
  • 此类指令参入的源操作数和目的操作数有 #data/A/Rn/@Ri/direct 五个,其不同组合,共有 15 条指令
  • 新手必看的单片机控制转移指令
  • loop转移指令

    2020-11-14 22:13:36
    loop指令为循环指令,所有的循环指令都是短转移指令 所有条件转移指令都是短转移指令,对于的机器码中包含了位移的范围(-128~127) 这个位移范围是编译器在编译的时候计算出来的 指令格式:loop 标号(cx=cx-1,...
  • 8051单片机教程 上一课:8051单片机教程第十三课:逻辑与指令 http://www.eeskill.com/article/id/37455
  • 一.jmp指令(1)指令格式: jmp 标记名称(2指令意义: 无条件转移指令,类似c语言goto指令,执行此指令时,先将标记名称所在的地址入到指令寄存器(ip)内,程序就执行ip所指之处的指令.(3)指令执行后,根据结果可能变动的标记:...
  • 文章目录一、无条件转移指令1.1 无条件段内转移指令1.2 无条件段间转移指令 一、无条件转移指令 我们知道,一般的指令是不允许操作 CSCSCS 和 IPIPIP 的,因为它们一旦被允许操作了,执行代码的顺序就会变得不确定,...
  • 汇编语言之转移指令

    千次阅读 2021-11-02 22:23:52
    1.转移指令 定义:修改IP或同时修改CS和IP的指令称为转移指令 jmp short jmp near ptr jmp +偏移量:并没有给出目的地址的地址,而是给出了目的地址相对此时IP的偏移量 jmp far ptr:段间转移
  • 条件转移指令详解

    万次阅读 多人点赞 2020-03-08 20:01:09
    程序控制指令又称为控制转移指令,包括:转移指令循环控制指令、过程调用指令和 中断指令 4 类。转移指令又分为无条件转移指令和条件转移指令。 1.无条件转移指令 JMP 计算机程序的执行完全按照 CS:IP 的指向执行...
  • 汇编中的转移指令可以将执行程序中的某一段代码跳转到其他代码块进行执行。相当于Java中的if,switch等分支代码进行代码之间的跳转。它也可以实现方法调用
  • 51单片机之控制转移指令SJMP、LJMP等

    万次阅读 多人点赞 2019-05-31 23:49:49
    文章目录前言一、无条件转移指令LJMP addr16AJMP addr11SJMP relJMP @A + DPTR关于SJMP、AJMP、LJMP的选择二、条件转移指令JZ rel 前言 控制指令是将程序跳转到某个指定的地址,在顺序执行 控制指令是通过修改PC的...
  • 转移指令

    2019-10-05 21:01:12
    可以修改IP,或可以同时修改CS和IP的指令称为转移指令转移指令就是可以控制CPU执行内存中某处代码的指令。 只修改IP时,称为段内转移,如:jmp ax 同时修改CS和IP时,称为段间转移,如:jmp 1000:0 由于转移指令对...
  • 常用转移指令总结

    千次阅读 2020-11-03 21:35:51
    常用转移指令总结 一,jmp指令(无条件转移指令) 1,指令格式 ①段间转移(远转移): jmp far ptr+标号 ②段内短转移: jmp short +标号(8位的位移) ③段内近转移 jmp near ptr+标号(16位位移) 2,jmp...
  • 可以修改IP,或者同时修改CS与IP的指令统称为转移指令。 因为CS:IP是指令寄存器,比较特殊,且CS无法用其他寄存器直接赋值,如:mov cs,ax。 所以需要jmp,call,ret,loop等指令来修改IP或同时修改CS与IP。 CS:IP的...
  • 控制转移指令

    2020-07-10 23:04:43
    控制转移指令 一、 实验目的 a) 熟悉、掌握各种控制转移指令格式及其功能 b) 学会使用控制转移指令来控制程序的执行流程 二、 实验重难点 a) 重点:实验中要用到不少控制转移指令,因此要熟悉、掌握 各类控制转移指令...
  • 一 、转移指令 1.无条件转移指令 JMP 格式: 转移地址可用:寄存器寻址和存储器寻址 2.条件转移指令 Jcc https://blog.csdn.net/qq_36215315/article/details/79879391 这篇文章里写的也挺清楚 注: 只能完成...
  • 如何编出占用空间小运行效率高的循环代码呢?下面我们一起来看看。
  • 目录控制转移类指令无条件转移指令JMP段内转移、直接寻址段内转移、间接寻址条件转移指令判断单个标志位状态比较无符号数高低比较有符号数大小循环指令(loop)子程序指令中断指令系统功能调用字符输出的功能调用字符...
  • 控制转移指令,指令包括:JMP,JCC,JCXZ,LOOP,LOOPZ,LOOPNZ,LOOPNE,CALL,RET,INT
  • 可以修改 IP,或同时修改 CS 和 IP 的指令统称为转移指令。概括地讲,转移指令就是可以控制CPU执行内存中某处代码的指令。 8086CPU的转移行为有以下分类: 只修改IP,称为段内转移,如 jmp ax 同时修改IP和CS,称为...
  • 汇编语言 循环控制指令

    千次阅读 2021-06-13 19:45:18
    循环控制指令是一组增强型的条件转义指令,用来控制一个程序段的重复执行,重复次数由CX...如果减1后CX≠0,则转移指令中所给定的标号处继续循环;若自动减1后CX=0,则结束循环,转去执行LOOP指令之后的那条指令
  • 关于转移指令和调用指令的寻址 下面以转移指令为对象来分析各种转移地址的寻址方式 (1)段内直接转移方式 用这种方式时,指令中给出一个相对位移量,这样,专一地址为EIP的当前内容再加上一个8位、16位或32位的位移...
  • 汇编之控制转移指令

    2020-10-21 21:37:18
    汇编之控制转移指令前言 前言
  • 转移指令由于其自身的特殊性,总是会给我们带来一些麻烦。那对于流水线处理器来说,更是如此,转移指令会带来更多不良的影响。那我们应该如何应对和解决呢?这一节我们就来探索这个问题。 我们先来看一看转移指令对...
  • 微机原理--控制转移指令

    千次阅读 2019-11-01 13:37:21
    转移指令 1.JMP(unconditional jump)无条件转移 程序转移到目的操作数指定的地址执行,不需要满足任何条件. 操作数可以是标号、立即数,也可以是寄存器操作数或存储器操作数 Short jump 段内直接短转移 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 42,395
精华内容 16,958
关键字:

循环转移指令