精华内容
下载资源
问答
  • 转移指令
    2019-10-05 21:01:12

    可以修改IP,或可以同时修改CS和IP的指令称为转移指令。转移指令就是可以控制CPU执行内存中某处代码的指令。

    只修改IP时,称为段内转移,如:jmp ax

    同时修改CS和IP时,称为段间转移,如:jmp 1000:0

    由于转移指令对IP的修改范围不同,段内转移又分为:短转移和近转移。

    短转移IP的修改范围为-128--127
    近转移IP的修改范围为-32768--32767

    8086CPU的转移指令分为以下几类:

    无条件转移指令:jmp
    条件转移指令
    循环指令。loop
    过程
    中断

    操作符: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

    jmp指令:

    jmp为无条件转移指令,可以只修改IP,也可以同时修改CS和IP。

    jmp要同时给出两种信息:

    • 转移的目的地址
    • 转移的距离(段间转移,段内转移,段内近转移)

    jmp short标号(转到标号处执行)

    assume cs:codeseg
    codeseg segment
        start: mov ax,0
               jmp short s     ;转到标号s处执行
               add ax,1
            s: inc ax
    codeseg ends
    end start

    CPU在执行jmp指令的时候并不需要转移的目的地址,而需要的是转移的位移。这个位移,是编译器根据汇编指令中的标号计算出来的。

    转移位移的计算方法:

    实际上,jmp short标号怕功能为IP=IP+8位位移。

    1. 8位位移=标号处的地址-jmp指令后的第一个字节的地址;
    2. short表明此处位移为8位位移;
    3. 8位位移范围为-128--127,用补码表示;
    4. 8位位移由编译器在编译时算出。

    jmp near ptr标号:段内近转移

    实际上,near ptr标号的功能为:IP=IP+16位位移。

    1. 16位位移=标号处的地址-jmp指令后的第一个字节的地址;
    2. near ptr标号表明此处位移为16位位移;
    3. 16位位移范围为-128--127,用补码表示;
    4. 16位位移由编译器在编译时算出。

    转移的目的地址在指令中的jmp指令:

    jmp far ptr标号:段间转移,又称为远转移。

    CS=标号所在段的段地址;IP=标号在段中的偏移地址。

    far ptr指明了指令用标号的段地址和偏移地址修改CS和IP。

    assume cs:codesg
    codesg segment
        start: mov ax,0
               mov bx,0
               jmp far ptr s
               db 256 dup(0)
            s: add ax,1
               inc ax
    codesg ends
    end start

    高地址存储转移的段地址,低地址存储偏移地址。

    转移地址在寄存器中的jmp指令:转移地址在寄存器中的jmp指令:

    指令格式:jmp 16位reg

    功能:IP=16位reg

    转移地址在内存中的jmp指令:

    1. jmp word ptr 内存单元地址(段内转移)

    功能:从内存单元地址处开始存放一个字,是转移的目的偏移地址。

    内存单元地址可以寻址方式的任一格式给出。

    如:

    mov ax,0123h
    mov ds:[0],ax
    jmp word ptr ds:[0]
    
    IP = 0123h

    又如:

    mov ax,0123h
    mov [bx],ax
    jmp word ptr [bx]
    
    IP = 0123h

    2. jmp dword ptr 内存单元地址(段间转移)

    功能:从内存单元地址开始处存放两个字,高地址处的字是转移的目的段地址,低地址处是转移的目的地址的偏移地址。

    CS=内存单元地址+2

    IP=内存单元地址

    内存单元地址可用寻址方式的任一格式给出。

    如:

    mov ax,0123h
    mov ds:[0],ax
    mov word ptr ds:[2],0
    jmp dword ptr ds:[0]
    
    CS=0   IP=0123h   CS:IP=0000:0123

    jcxz指令:

    jcxz为有条件转移指令,所有的有条件转移指令都是短转移,在对应的机器码中包含转移的位移,而不是目的地址。

    对IP的修改范围:-128--127

    格式:jcxz标号(如果cx=0,转移到标号处执行)

    操作:当cx=0时,IP=IP+8位位移。

    8位位移=标号处的地址-jcxz指令后的第一个字节的地址;

    8位位移的范围为:-128--127,用补码表示。

    8位位移有编译器在编译时算出。

    当cx=0时,程序向下执行,否则什么也不做。

    像这样:

    if(cx == 0)
        jmp short 标号

    loop指令:

    loop为循环指令,所有的循环指令都是短转移,在对应的机器码中,包含的是转移的位移,而不是地址。

    对IP的修改范围:-128--127

    格式:loop标号(cx=cx-1,如果cx != 0,转移到标号处执行)

    操作:cx=cx-1; if(cx != 0), IP=IP+8位位移。

    根据位移进行转移的意义:

    jmp short 标号

    jmp near ptr 标号

    jcxz 标号

    loop 标号

    在它们对应的机器码中不包含转移的目的地址,而包含的是目的地址的位移。

    这种设计,方便了程序段在内存中的浮动配置。

    如果机器码中包含了准确的地址,则就对程序段在内存中的偏移地址有了严格的限制,如果标号处的指令不在目的地址处,程序的执行就会出错。而利用偏移地址,无论标号处的指令实际长度是多少,指令的转移是不变的。

    注意:根据位移进行位移的指令,它们的转移范围受到转移位移的限制,如果在源程序中出现了转移范围超界的问题,在编译的时候,编译器将报错。

    转载于:https://www.cnblogs.com/coolcpp/p/jmp.html

    更多相关内容
  • 控制转移指令用于控制程序的流向,所控制的范围即为程序存储器区间,MCS-51系列单片机的控制转移指令相对丰富,有可对64kB程序空间地址单元进行访问的长调用、长转移指令,也有可对2kB字节进行访问的绝对调用和绝对...
  • 转移指令 一、无条件转移指令 (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 
        

    在这里插入图片描述

    展开全文
  • 8051单片机教程 上一课:8051单片机教程第十三课:逻辑与指令 http://www.eeskill.com/article/id/37455
  • 1 引言 在RISC CPU的设计当中,转移指令的处理对处理器的性能的影响非常关键。转移指令决定着程序的执行顺序,在程序中的使用频率很高。RISC CPU中程序是以流水线的方式执行的,当程序顺序执行时,下一条指令的地址...
  • 本文主要介绍了51单片机条件转移指令
  • 新手必看的单片机控制转移指令
  • 可以修改IP,或者同时修改CS与IP的指令统称为转移指令。 因为CS:IP是指令寄存器,比较特殊,且CS无法用其他寄存器直接赋值,如:mov cs,ax。 所以需要jmp,call,ret,loop等指令来修改IP或同时修改CS与IP。 CS:IP的...

    可以修改IP,或者同时修改CS与IP的指令统称为转移指令

    因为CS:IP是指令寄存器,比较特殊,且CS无法用其他寄存器直接赋值,如:mov cs,ax。

    所以需要jmp,call,ret,loop等指令来修改IP或同时修改CS与IP。

    CS:IP的组合用来实现8086CPU的20位寻址(虽然8086的寄存器是16位的,但8086内部有20位地址加法器)。

    另外,8086CPU是小端模式。内存高地址存放数据高位,内存低地址存放数据低位。

    转移指令种类

    8086转移指令种类:

    • 无条件转移指令(如 jmp)

    • 条件转移指令(如 jcxz)

    • 循环指令(如 loop)

    • 过程(如 call、ret、retf)

    • 中断

    伪指令offset

    offset 是伪指令,由汇编器识别并处理,用于取得标号的偏移地址。如:

    start: mov ax,offset start ; 相当于mov ax,0

    s: mov ax,offset s ; 相当于mov ax,3(因为 mov ax,0 指令占3字节)

    jmp无条件转移

    根据位移来转移的jmp指令

    jmp short 标号,段内短转移

    功能:

    jmp short 标号 功能为:IP=IP+8位位移

    1. 8位位移=标号处的地址 - jmp指令后的第一个字节的地址;
    2. short 指明此处的位移为8位位移;
    3. 8位位移的范围是 -128~127,用补码表示 [注1];
    4. 8位位移由编译程序在编译时算出。

    注1:

    正数的原码与反码、补码相同。负数的反码为绝对值相同的正数按位取反,补码为反码+1。

    jmp near ptr 标号,段内近转移

    功能:

    jmp near ptr 标号 功能为:IP=IP+16位位移

    1. 16位位移=标号处的地址 - jmp指令后的第一个字节的地址;
    2. near ptr 指明此处的位移为16位位移;
    3. 16位位移的范围是 -32768~32767 ,用补码表示;
    4. 16位位移由编译程序再编译时算出。

    段间转移、远转移jmp

    jmp far ptr 标号

    功能:

    CS=标号所在段的段地址;IP=标号所在段的偏移地址。

    如:

    start: mov ax,0 ; 假设标号处段地址=0123h、偏移地址=10h

    mov bx,0

    jmp far ptr start ; 执行完后,CS=0123h,IP=10h

    转移地址在寄存器中的jmp

    jmp 16位寄存器

    如:jmp ax,功能:IP=AX。

    转移地址在内存中的jmp

    jmp word ptr 内存单元地址

    功能:

    段内转移,使得 IP=内存单元地址处的一个字(占2字节)

    如:

    mov ax,0123h

    mov ds:[0],ax

    jmp word ptr [0] ; 执行后,IP=0123h

    jmp dword ptr 内存单元地址

    功能:

    段间转移,使得 CS=内存单元地址+2 处的一个字(2字节)、IP=内存单元地址 处的一个字(2字节)

    也就是说,内存高位的一个字给CS寄存器,内存低位的一个字给IP寄存器。

    如:

    mov ax,0123h

    mov [bx],ax

    mov word ptr [bx+2],0

    jmp dword ptr [bx] ; 执行后,CS=0,IP=0123h

    jcxz条件转移指令

    jcxz可以理解为:Jump if CX equal Zero。

    语法:jcxz 标号(如果 cx=0,转移到标号处执行)

    功能:

    jcxz 指令为有条件转移指令,所有有条件转移指令都是短转移,指令机器码中包含位移而不是目的地址。

    1. 当 cx=0 时,IP=IP+8位位移;
    2. 8位位移=标号处的地址 - jcxz指令后的第一个字节的地址;
    3. 8位位移的范围是 -128~127,用补码表示;
    4. 8位位移由编译程序在编译时算出。
    5. 当 cx ≠ 0 时,什么也不做,程序继续向下执行。

    jcxz 标号 的功能相当于:

    if (cx == 0) jmp short 标号

    loop转移指令

    语法:loop 标号(cx–,如果cx ≠ 0,转移到标号处执行)

    功能:

    loop 指令位循环指令,所有循环指令都是短转移,指令机器码中包含位移而不是目的地址。

    操作:

    cx=cx-1
    如果 cx ≠ 0,IP=IP+8位位移

    1. 8位位移=标号处的地址 - loop指令后的第一个字节的地址;
    2. 8位位移的范围是 -128~127,用补码表示;
    3. 8位位移由编译程序在编译时算出。
    4. 当 cx = 0 时,什么也不做,程序继续向下执行。

    loop 标号 的功能相当于:

    cx--;
    if (cx != 0) jmp short 标号

    ret和retf转移指令

    ret与retf指令

    ret 指令用栈中的一个字的数据(ss:sp指向的栈),修改IP寄存器,实现近转移(段内转移)。

    retf 指令用栈中的二个字的数据(ss:sp指向的栈),修改CS和IP,实现远转移(段间转移)。

    功能:

    ret 指令,进行如下两步操作:

    1. IP=SS*16 + SP 出栈,令IP=栈顶的2个字节
    2. SP=SP+2 栈指针指向栈中下一个字节

    retf 指令,进行如下4步操作:

    1. IP=SS*16 + SP 栈顶2字节给IP
    2. SP=SP+2
    3. CS=SS*16 + SP 栈中接下来2字节CS
    4. SP= SP+2

    如果用汇编语法来解释 ret 相当于:

    pop IP

    如果用汇编语法来解释 retf 相当于:

    pop IP

    pop CS

    ret n 指令

    ret n 的含义相当于:

    pop ip
    add sp,n

    call转移指令

    call 标号(将当前IP压栈,转到标号处执行指令)

    操作:

    1. SP=SP-2 修改栈顶指针
    2. SS*16+SP=IP 当前IP的值压栈
    3. IP=IP+16位位移 IP加上根据标号计算出的16位位移(即段内近转移,call指令没有段内短转移)

    说明:

    1. 16位位移=标号处的地址 - call指令后的第一个字节的地址;
    2. 16位位移的范围是 -32768~32767,用补码表示;
    3. 16位位移由编译程序在编译时算出。

    call 标号 相当于:

    push IP

    jmp near ptr 标号

    call far ptr 标号(将当前CS和IP依次压栈,转到标号处执行指令)

    call far ptr 标号 实现段间转移,操作:

    1. sp=sp-2
      ss*16+sp=CS
      sp=sp-2
      ss*16+sp=IP
    2. CS=标号所在段地址
      IP=标号所在段的偏移地址

    call far ptr 标号,相当于:

    push CS

    push IP

    jmp far ptr 标号

    call 16位寄存器(将当前IP压栈,从寄存器获得偏移地址给IP)

    功能:

    sp=sp-2
    ss*16+sp=IP
    IP=16位寄存器

    call 16位寄存器 相当于执行:

    push IP

    jmp 16位reg

    call word ptr 内存单元地址

    此指令相当于执行:

    push IP

    jmp word ptr 内存单元地址

    如:

    mov sp,10h

    mov ax,0123h

    mov ds:[0],ax

    call word ptr ds:[0]

    最后,IP=0123h,栈指针SP=0eh

    call dword ptr 内存单元地址

    此指令相当于执行:

    push CS

    push IP

    jmp dword ptr 内存单元地址

    如:

    mov sp,10h

    mov ax,0123h

    mov ds:[0],ax

    mov word ptr ds:[2],0

    call dword ptr ds:[0]

    最后,CS=0,IP=0123h,栈指针SP=0ch

    cmp与根据比较结果转移的指令

    先说说8086标志寄存器结构

    标志寄存器在Debug程序中的表示:

    算术逻辑运算相关指令:

    add, sub, mul, div, inc, dec, or, and 等

    传送相关指令:

    mov, push, pop 等

    修改标志寄存器的指令:

    pushf,把标志寄存器的值入栈

    popf,从栈中弹出数据放入标志寄存器

    标志位含义

    ZF:执行算数逻辑运算指令后,保存结果的寄存器中,结果是0,zf=1,反之zf=0

    PF:执行算数逻辑运算指令后,保存结果的寄存器中,有偶数个1(0个1也是偶数)时,pf=1,奇数个1时,pf=0

    SF:执行算数逻辑运算指令后,保存结果的寄存器中,符号位是1,sf=1,符号位是0,sf=0

    CF:执行无符号数运算后,加法有进位或减法有借位时,cf=1,反之,cf=0

    OF:执行有符号数运算后,如果有溢出(运算结果超出结果寄存器的有符号数表示范围称为溢出),of=1,否则of=0

    cmp指令

    cmp 是比较指令,相当于减法指令,但不会保存结果。cmp 执行后会对标志寄存器产生影响。

    格式:cmp 操作对象1, 操作对象2

    无符号数的cmp(涉及到标志位 ZF、CF):

    有符号数的cmp(涉及到标志位 SF、OF、ZF):

    根据比较结果转移的指令

    这些指令与cmp配合使用,这些指令就是检测cmp执行后影响到的标志位:

    根据有符号数的比较结果进行转移的条件转移指令与无符号数的原理相同,只是检查的标志位有所不同。

    展开全文
  • 汇编语言——条件转移指令

    千次阅读 2021-01-11 20:55:04
    OD里能查看到 除IF标志外的 8个标志位 JMP //014 JE/JZ //= //012 Jump if Equl JNE/JNZ //不= //013 //带符号数条件转移指令 JL /JNGE //不>= //小于  //015 JLE/JNG //不> //小于等于 //016 JG/JNLE /...

    标志寄存器PSW

    标志寄存器PSW(程序状态字寄存器PSW)
       标志寄存器PSW是一个16为的寄存器。它反映了CPU运算的状态特征并且存放某些控制标志。8086使用了16位中的9位,包括6个状态标志位和3个控制标志位。

    15

    14

    13

    12

    11

    10

    9

    8

    7

    6

    5

    4

    3

    2

    1

    0

     

     

     

     

    OF

    DF

    IF

    TF

    SF

    ZF

     

    AF

     

    PF

     

    CF

     

     

     

     

     

     

     

     

     

    标志

     

     

     

     

     

     

       CF(进位标 志位):当执行一个加法(减法)运算时,最高位产生进位(或借位)时,CF为1,否则为0。
       ZF零标志:若当前的运算结果为零,则ZF为1,否则为0。
       SF符号标志位:该标志位与运算结果的最高位相同。即运算结果为负,则SF为1,否则为0
       OF溢出标志位:若运算结果超出机器能够表示的范围称为溢出,此时OF为1,否则为0。判断是否溢出的方法是:进行二进制运算时,最高位的进位值与次高位的进位值进行异或运算,若运算结果为1则表示溢出OF=1,否则OF=0
       PF奇偶标志:当运算结果的最低16位中含1的个数为偶数则PF=1否则PF=0
       AF辅助进位标志:一个加法(减法)运算结果的低4位向高4位有进位(或借位)时则AF=1否则AF=0  


       另外还有三个控制标志位用来控制CPU的操作,可以由程序进行置位和复位。
       TF跟踪标志:该标志位为方面程序调试而设置。若TF=1,8086/8088CPU处于单步工作方式,即在每条指令执行结束后,产生中断。
       IF中断标志位:该标志位用来控制CPU是否响应可屏蔽中断。若IF=1则允许中断,否则禁止中断。
       DF方向标志:该标志位用来控制串处理指令的处理方向。若DF=1则串处理过程中地址自动递减,否则自动递增。

     

    OD里能查看到 除IF标志外的 8个标志位

    JMP                        //014

    JE/JZ     //=                //012 Jump if Equl

    JNE/JNZ  //不=              //013

    //带符号数条件转移指令

    JL /JNGE  //不>=  //小于  <   //015

    JLE/JNG  //不>   //小于等于<=  //016

    JG/JNLE  //不<=  //大于     >//017

    JGE/JNL  //不<   //大于等于>=  //017

    Jump     跳转/转移

    Not      不

    Equal    相等

    Zero    零

    Less    小于

    Greater 大于

     

    一、条件转移指令

    助忆符

    检测的转移条件

    功能描述

     

    JE/JZ

    ZF=1

    Jump Equal    == 跳转

    Jump Zero                != 不跳转

    JNE/JNZ

    ZF=0

    Jump Not Equal != 跳转

    Jump Not Zero             == 不跳转

    JG/JNLE

    ZF=0&&SF=OF

    Jump Greater   >跳转

    Jump Not Less or Equal    <= 不跳转

    JGE/JNL

    SF=OF

    Jump Greater Equal >=跳转

    Jump Not Less             <  不跳转

    JL/JNGE

    SF!=OF

    Jump Less   <跳转

    Jump Not Greater or Equal  >= 不跳转

    JLE/JNG

    ZF=1 || SF!=OF

    Jump Less or Equal  <=跳

    Jump Not Greater           > 不跳转

    无符号条件转移

    检测的转移条件

    功能描述

     

    JA/JNBE

    CF=0 &&ZF=0

    Jump Above   >跳转

    Jump Not Below or Equal  <= 不跳转

    JNB/JAE/JNC

    CF=0

    Jump Above or Equal >=跳转

    Jump Not Below           <  不跳转

    JB/JNAE/JC

    CF=1

    Jump Below <跳转

    Jump Not Above or Equal  >= 不跳转

    JBE/JNA

    CF=1 or AF=1

    Jump Below or Equal  <=

    Jump Not Above            > 不跳转

     

    Above 高于

    Below 低于

     

     

     

    二、代码测试

     

    JE/JZ              != 不跳转

    JNZ/JNE            == 不跳转

    JG/JNLE           <= 不跳转

    JGE/JNL            <  不跳转

    JL/JNGE           >= 不跳转

    JLE/JNG            > 不跳转 

    printf("begin\n");

    //unsigned

    int a=3,b=5;

    if (a!=b) //je

    if (a==b) //jnz

    if (a<=b) //jg

    if (a<b) //jge

    if (a>=b) //jl

    if (a>b)//jle

    {

    printf("do if");

    }

    printf("end");

    return 0;

    展开全文
  • 微机原理 转移指令

    2021-10-28 21:36:57
    jmp是无条件转移指令,可以只修改IP,也可以同时修改CS和IP的值 jmp指令给出两个信息:1)转移的目的地址,2)转移的距离(断段间转移、段内短转移、段内近转移) 格式: jmp:段地址:偏移地址(用段地址修改CS 用...
  • 汇编语言之转移指令

    2021-11-02 22:23:52
    1.转移指令 定义:修改IP或同时修改CS和IP的指令称为转移指令 jmp short jmp near ptr jmp +偏移量:并没有给出目的地址的地址,而是给出了目的地址相对此时IP的偏移量 jmp far ptr:段间转移
  • 控制转移指令常见的控制转移指令1,无条件转移指令JMP2,子程序(过程)调用指令CALL3,子程序(过程)返回指令RET4,条件转移指令5、循环指令 LOOP 控制转移指令用来控制程序的执行顺序,用于实现分支、循环、过程调用...
  • 条件转移指令详解

    万次阅读 多人点赞 2020-03-08 20:01:09
    程序控制指令又称为控制转移指令,包括:转移指令、循环控制指令、过程调用指令和 中断指令 4 类。转移指令又分为无条件转移指令和条件转移指令。 1.无条件转移指令 JMP 计算机程序的执行完全按照 CS:IP 的指向执行...
  • 汇编语言(七)—— 转移指令

    千次阅读 2020-03-07 21:32:07
    汇编语言基础学习笔记(七)—— 转移指令转移指令程序流程的控制转移JMP指令Jcc指令利用零位标志ZF的条件转移指令利用进位标志CF的条件转移指令利用溢出标志OF的条件转移指令利用符号标志SF的条件转移指令利用奇偶...
  • 条件转移指令是指在满足一定条件时进行相对转移。如: 判A内容是否为0转移指令 JZ rel JNZ rel
  • 控制转移指令

    2020-07-10 23:04:43
    控制转移指令 一、 实验目的 a) 熟悉、掌握各种控制转移指令格式及其功能 b) 学会使用控制转移指令来控制程序的执行流程 二、 实验重难点 a) 重点:实验中要用到不少控制转移指令,因此要熟悉、掌握 各类控制转移指令...
  • 本章将为OpenMIPS处理器添加转移指令转移指令包括跳转、分支两种,区别是前者是绝对转移,后者是相对转移,但实现方法是相似的。转移指令涉及延迟槽。 8.1 延迟槽 在实现转移指令之前,先介绍一下延迟槽的概念。在...
  • 转移指令由于其自身的特殊性,总是会给我们带来一些麻烦。那对于流水线处理器来说,更是如此,转移指令会带来更多不良的影响。那我们应该如何应对和解决呢?这一节我们就来探索这个问题。 我们先来看一看转移指令对...
  • 51单片机之控制转移指令SJMP、LJMP等

    万次阅读 多人点赞 2019-05-31 23:49:49
    文章目录前言一、无条件转移指令LJMP addr16AJMP addr11SJMP relJMP @A + DPTR关于SJMP、AJMP、LJMP的选择二、条件转移指令JZ rel 前言 控制指令是将程序跳转到某个指定的地址,在顺序执行 控制指令是通过修改PC的...
  • 控制转移指令1.1 条件跳转指令1.2 比较条件跳转指令1.3 多条件分支跳转指令1.4 无条件跳转指令 1.控制转移指令 控制转移指令分为如下图所示的5种,其中比较指令在算术指令中描述过。 1.1 条件跳转指令 条件跳转...
  • 常用转移指令总结

    千次阅读 2020-11-03 21:35:51
    常用转移指令总结 一,jmp指令(无条件转移指令) 1,指令格式 ①段间转移(远转移): jmp far ptr+标号 ②段内短转移: jmp short +标号(8位的位移) ③段内近转移 jmp near ptr+标号(16位位移) 2,jmp...
  • 此类指令参入的源操作数和目的操作数有 #data/A/Rn/@Ri/direct 五个,其不同组合,共有 15 条指令
  • 汇编语言-转移指令

    2020-03-11 18:31:37
    可以修改IP,或同时修改CS和IP的指令统称为转移指令。概括地讲,转移指令就是可以控制CPU执行内存中某处代码的指令。 8086CPU的转移行为有以下几类。 只修改IP时,称为段内转移,比如:jmp ax 同时修改CS和IP时,...
  • 控制转移指令用于控制程序的流向,所控制的范围即为程序存储器区间,MCS-51系列单片机的控制转移指令相对丰富,有可对64kB程序空间地址单元进行访问的长调用、长转移指令,也有可对2kB字节进行访问的绝对调用和绝对...
  • 目录控制转移类指令无条件转移指令JMP段内转移、直接寻址段内转移、间接寻址条件转移指令判断单个标志位状态比较无符号数高低比较有符号数大小循环指令(loop)子程序指令中断指令系统功能调用字符输出的功能调用字符...
  • 指令系统转移指令PPT学习教案.pptx
  • 1、可以修改IP,或同时修改CS和IP的指令称为转移指令。 2、8086CPU的转移 行为分为段内转移(只修改IP) 和 段间转移(同时修改CS和IP)。 3、段内转移分为短转移(IP修改范围-128~127) 和 近转移(IP修改范围-...
  • 微机原理--控制转移指令

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

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 95,467
精华内容 38,186
关键字:

转移指令

友情链接: ASpNETAJAX.rar