精华内容
下载资源
问答
  • 条件跳转指令 383

    千次阅读 2012-04-28 11:31:50
    7.5 条件跳转指令 383  http://book.csdn.net/ 2006-6-29 15:00:00 图书导读 当前章节:7.5 条件跳转指令 383 ·7.2 低级控制结构 378 ·7.3 语句标号 378 ·7.4 无条件控制转移(JMP) 380 ·7.6...
    
    

    虽然jmp指令提供了控制转移,但是它不允许进行任何复杂的判断。80x86条件跳转指令提供了这种判断。条件跳转指令是创建循环和实现其他条件执行语句,如if…endif的基本要素。

    条件跳转指令检查一个或多个标志位,判断它们是否匹配某个特殊条件(就像setcc指令):如果标志匹配成功,该指令就将控制转移到目标位置;如果匹配失败,CPU忽略该条件跳转指令而继续执行下一条指令。一些条件跳转指令只是简单测试符号位(sign)、进位位(carry)、溢出位(overflow)、零标志(zero)位的设置。例如,在执行一条sh1指令后,您需要测试进位标志,来判断sh1是否从操作数的高地址位移出一位。类似地,也可以在一条test指令后测试零标志位,来判断指定的位是否为1。大多数情况,在cmp指令之后执行条件跳转指令。cmp指令设置标志位,以便判断小于、大于、等于等情况。

    条件跳转指令形式如下:

    Jcc label;

    其中,Jcc中的“cc”,必须用表示测试条件类型的字符序列替换。这些字符和setcc指令使用的一样。例如,“js”表示根据符号(sign)标志是否被置位来决定是否跳转。一个典型的js指令如下:

    js ValueIsNegative ;

    在这个示例中,如果符号(sign)标志被置位,则js指令将控制转移到ValueIsNegative语句标号处;如果符号标志清零,则将控制直接转移给js指令后的指令。

    与无条件jmp指令不同,条件跳转指令不提供间接跳转的形式。惟一允许的形式是跳转到程序中某一标号处。条件跳转指令有一个限制:目标标号的位置必须在跳转指令本身附近32768字节范围内,这通常对应着8000~32000条机器指令。一般情况下不会超过这种限制。

    注意:Intel文档为许多条件跳转指令定义了多种替代名或指令别名。表7-1、7-2和7-3列出了每个指令所有的别名。这些表格也列出了表示相反分支的指令。很快您将明白这些相反分支指令的作用。

    表7-1 测试标志位的JCC指令

    指 令

    描 述

    条 件

    别 名

    相 反 指 令

    JC

    如果进位位被置位则跳转

    进位标志=1

    JB,JNAE

    JNC

    JNC

    如果进位位没有置位则跳转

    进位标志=0

    JNB,JAE

    JC

    JZ

    如果0标志被置位则跳转

    0标志=1

    JE

    JNZ

    JNZ

    如果0标志没有置位则跳转

    0标志=0

    JNE

    JZ

    (续表)

    指 令

    描 述

    条 件

    别 名

    相反指令

    JS

    如果符号位被置位则跳转

    符号标志=1

    JNS

    JNS

    如果符号位没有被置位则跳转

    符号标志=0

    JS

    JO

    如果溢出标志置位则跳转

    溢出标志=1

    JNO

    JNO

    如果溢出标志没有置位则跳转

    溢出标志=0

    JO

    JP

    如果奇偶校验位被置位则跳转

    奇偶校验标志=1

    JPE

    JNP

    JPE

    如果奇偶校验位为偶校验则跳转

    奇偶校验标志=1

    JP

    JPO

    JNP

    如果奇偶校验位没有被置位则跳转

    奇偶校验标志=0

    JPO

    JP

    JPO

    如果奇偶校验位为奇校验则跳转

    奇偶校验标志=0

    JNP

    JPE

    表7-2 使用无符号数比较的JCC指令

    指 令

    描 述

    条 件

    别 名

    相反指令

    JA

    如果超过(>)则跳转

    进位标志=0,0标志=0

    JNBE

    JNA

    JNBE

    如果不低于或等于(不 <=)则跳转

    进位标志=0,0标志=0

    JA

    JBE

    JAE

    如果超过或等于(>=)则跳转

    进位标志=0

    JNC,JNB

    JNAE

    JNB

    如果不低于则跳转(不 <)

    进位标志=0

    JNC,JAE

    JB

    JB

    如果低于(<)则跳转

    进位标志=1

    JC,JNAE

    JNB

    JNAE

    如果不超过或等于(不>=)则跳转

    进位标志=1

    JC,JB

    JAE

    JBE

    如果低于或等于(<=)则跳转

    进位标志=1或0标志=1

    JNA

    JNBE

    JNA

    如果不超过(不>)则跳转

    进位标志=1或0标志=1

    JBE

    JA

    JE

    如果相等(=)则跳转

    0标志=1

    JZ

    JNE

    JNE

    如果不相等(<>)则跳转

    0标志=0

    JNZ

    JE

    表7-3 使用有符号数比较的JCC指令

    指 令

    描 述

    条 件

    别 名

    相反指令

    JG

    如果大于(>)则跳转

    符号标志=溢出标志或0标志=0

    JNLE

    JNG

    JNLE

    如果小于或等于(<=)则跳转

    符号标志=溢出标志或0标志=0

    JG

    JLE

    JGE

    如果大于或等于(>=)则跳转

    符号标志=溢出标志

    JNL

    JGE

    JNL

    如果不小于(不<)则跳转

    符号标志=溢出标志

    JGE

    JL

    JL

    如果小于(<)则跳转

    符号标志<>溢出标志

    JNGE

    JNL

    JNGE

    如果大于或等于(>=)跳转

    符号标志<>溢出标志

    JL

    JGE

    JLE

    如果小于或等于(<=)跳转

    符号标志<>溢出标志或0标志=1

    JNG

    JNLE

    JNG

    如果不大于(不>)则跳转

    符号标志<>溢出标志或0标志=1

    JLE

    JG

    JE

    如果等于(=)则跳转

    0标志=1

    JZ

    JNE

    JNE

    如果不等于(<>)则跳转

    0标志=0

    JNZ

    JE

    接下来将对“相反指令”一列进行简单的说明。在许多情况下,需要产生与某条分支指令条件相反的分支(在本章后面会给出示例),即相反分支。除了两个例外,都可以按下面的简单规则(后面统称为N/No N规则)产生相反分支:

    ● 如果Jcc的第二个字母不是“n”,则在“j”后面插入一个“n”。例如:je对应为jne,jl对应为jnl。

    ● 如果Jcc的第二个字母是“n”,则去掉指令中的“n”。例如:jng对应为jg,jne对应为je。

    不遵循这两条规则的两个例外是jpe(奇偶位为偶跳转)和jpo(奇偶位为奇跳转)。这两个例外并不会导致什么问题,因为:(a)很少需要测试奇偶标志;(b)可以使用别名jp和jnp替代jpe和jpo。而“N/No N”规则对jp和jnp是适用的。

    虽然jgejl的相反指令,但是建议使用jnl作为jl的相反指令。因为很容易误认为“大于是小于的相反”,从而把jg当作jl的相反指令。您可以坚持使用“N/No N”规则以避免这种混淆。

    80x86条件跳转指令提供了这样的能力:根据判断条件将程序流分支到两条路径中的某一条。例如,要实现:如果BX等于CX,则寄存器AX的值加1。可以使用下面的代码来完成该功能:

    cmp(bx,cx );

    jne SkipStmts;

    inc(ax );

    SkipStmts:

    其中的诀窍是使用相反分支指令来跳过在条件满足的情况下需要执行的指令。请坚持使用前面介绍的“N/no N”规则来选择相反分支指令。

    使用条件跳转指令还可以实现循环。例如,下面的代码序列实现了从用户输入读入一串字符,并将字符存储到一组连续的单元中,直到用户输入回车键。

       mov(0,edi );

    RdLnLoop:

      stdin.getc(); //Read a character into the AL register.

       mov(al,Input [edi])); //Store away the character.

       inc(edi ); //Move on to the next character.

       cmp(al,stdio.cr ); //See if the user pressed Enter.

       jne RdLnLoop;

    与setcc指令类似,条件跳转指令分为两类—— 测试特殊处理器标志位的条件跳转指令(例如jz、jc、jno)和测试某些条件(小于、大于等)的条件跳转指令。当测试某个条件时,条件跳转指令通常紧跟在一个cmp指令之后。cmp指令设置标志位后,如果是无符号数比较,使用ja、jae、jb、jbe、je或jne等指令测试这些标志来判断是否小于、小于等于、等于、不等于、大于或大于等于;如果是有符号数比较,则使用jl、jle、je、jne、jg、jge指令。

    条件跳转指令测试标志位,但不影响标志位。

    展开全文
  • jmp是无条件跳转,其余是条件跳转上图显示了j组指令,可以将其与条件代码访问指令结合使用以加深理解了解如何在机器指令级别编码跳转指令使用汇编语言跳转指令实现C语言条件分支如上所示,可以通过上面的指令将...

    f13ca80ab969ce31ff4894b93d0fd391.jpg

    跳转说明

    跳转指令也是一组指令,称为组j. jmp是无条件跳转,其余是条件跳转

    92e21a1bea89923ffcc4d18155dde6d8.png

    上图显示了j组指令,可以将其与条件代码访问指令结合使用以加深理解

    1e7db2fa5e1a13a9ca9312bcf17d696c.png

    了解如何在机器指令级别编码跳转指令

    ea09231f9649536c28ea553ca23b376c.png

    使用汇编语言跳转指令来实现C语言条件分支

    2a5a434e20e1f95aedb64952fc5f3a94.png

    82b39bfc770a296262c67db5b7339eec.png

    如上所示,可以通过上面的指令将左侧的程序翻译为汇编指令

    了解上述说明:

    使用条件数据传输指令来实现条件分支

    组合示例

    ee38b6996d990ad5db44c7654f40d2dd.png

    ce6e6b1e09ff96a24fb3265a33f32db2.png

    该指令是删除跳转指令-fno-if-conversion

    有条件的数据传输指令过程:

    首先计算一种情况(x-y)的结果并将其放入rax寄存器中;另一种计算它并将其放入rdx寄存器中;然后比较x和y的大小

    0c7ea0a1e695c456af2742aef096199f.png

    比较大小时使用cmov指令组,类似于设置的指令组. 如果cmovle小于或等于,则将rdx分配给rax;大于保持原样.

    条件数据传输指令可以很好地优化性能,但是并非所有条件数据分支都可以用条件语句表示,如下所示

    728ba39cf1728e7a01f6f03506ee43b9.png

    branch语句块包含非常繁重的计算,这导致计算成本比优化管道性能要大得多

    存在一些严重的风险情况. 如果必须在p不为0的前提下执行将p指针的值作为地址的操作c语言对应汇编语句,则条件数据传输指令将首先计算两个结果,然后进行选择. 此时,如果p指针不存在c语言对应汇编语句,将报告错误

    在计算中可能会有副作用,即所使用的变量相互关联. 这两个结果都将更新x,如果先使用条件数据传输指令来计算结果,则x的值将发生变化,这与原始逻辑不一致

    此处介绍了有关汇编语言跳转指令和C语言条件分支的本文. 有关更多相关的汇编语言跳转说明,请搜索Script House的上一篇文章,或继续浏览下面的相关文章. 该文章希望以后每个人都支持Script House!

    本文来自电脑杂谈,转载请注明本文网址:

    http://www.pc-fly.com/a/jisuanjixue/article-169628-1.html

    展开全文
  • 汇编跳转指令总结

    万次阅读 2016-02-25 14:41:06
    条件跳转指令是创建循环和实现其他条件执行语句。条件跳转指令检查一个或多个标志位,判断它们是否匹配某个特殊条件(就像setcc指令):如果标志匹配成功,该指令就将控制转移到目标位置;如果匹配失败,CPU忽略该条件...

     虽然jmp指令提供了控制转移,但是它不允许进行任何复杂的判断。80x86条件跳转指令提供了这种判断。条件跳转指令是创建循环和实现其他条件执行语句条件跳转指令检查一个或多个标志位,判断它们是否匹配某个特殊条件(就像setcc指令):如果标志匹配成功,该指令就将控制转移到目标位置;如果匹配失败,CPU忽略该条件跳转指令而继续执行下一条指令。条件跳转指令有一个限制:目标标号的位置必须在跳转指令本身附近32768字节范围内,这通常对应着800032000条机器指令。一般情况下不会超过这种限制。


    用自己的话总结:条件跳转指令是指jz,jg..等等指令,这些指令跳转方式是根据标志位的状态进行跳转,而设置这些标志的常见指令为cmptest指令,所以他们经常搭配使用(应该是必须的)。即跳转指令前一行要吗有cmp指令要吗有test指令。

    汇编标志位:

    标志名                          标志 1              标志 0

    OF (溢出标志)                 OV                  NV

    DF  (方向标志)                                         UP                  DN

    IF (中断标志)                 DI                  EI

    SF (符号标志位)               PL                  NG

    ZF (零标志)                   NZ                  ZR

    AF (辅助进位标志位)           NA                  AC

    PF (奇偶标志)                 PO                  PE

    CF (进位标志)                 NC                  CY


    反汇编窗口,对应的标志位(双击后面的数字可改变其状态



    Test和cmp指令的区别
    test属于逻辑运算指令
    Test对两个参数(目标,源)执行AND逻辑操作,并根据结果设置标志寄存器,结果本身不会保存。
    举例:
    Test的一个非常普遍的用法是用来测试一方寄存器是否为空:
    test ecx, ecx
    jz somewhere
    如果ecx为零,设置ZF零标志为1,Jz跳转
    --------------------------------------------
    CMP属于算术运算指令
    CMP比较.(两操作数作减法,仅修改标志位,不回送结果). 
    cmp实际上是只设置标志不保存结构的减法,并设置Z-flag(零标志).
    举例:
    Cmp eax, 2;       如果eax-2=0即eax=2就设置零标志为1
    Jz ****;          如果设置了零标志就跳转

    ============================================

    得出的结论
    test逻辑与运算结果为零,就把ZF(零标志)置1;
    cmp 算术减法运算结果为零,就把ZF(零标志)置1.

    指 令

    描 述

    条 件

    别 名

    相 反 指 令

    JC

    如果进位位被置位则跳转

    进位标志=1

    JB,JNAE

    JNC

    JNC

    如果进位位没有置位则跳转

    进位标志=0

    JNB,JAE

    JC

    JZ

    如果0标志被置位则跳转

    0标志=1

    JE

    JNZ

    JNZ

    如果0标志没有置位则跳转

    0标志=0

    JNE

    JZ

    指 令

    描 述

    条 件

    别 名

    相反指令

    JS

    如果符号位被置位则跳转

    符号标志=1

     

    JNS

    JNS

    如果符号位没有被置位则跳转

    符号标志=0

     

    JS

    JO

    如果溢出标志置位则跳转

    溢出标志=1

     

    JNO

    JNO

    如果溢出标志没有置位则跳转

    溢出标志=0

    JO

     

    JP

    如果奇偶校验位被置位则跳转

    奇偶校验标志=1

    JPE

    JNP

    JPE

    如果奇偶校验位为偶校验则跳转

    奇偶校验标志=1

    JP

    JPO

    JNP

    如果奇偶校验位没有被置位则跳转

    奇偶校验标志=0

    JPO

    JP

    JPO

    如果奇偶校验位为奇校验则跳转

    奇偶校验标志=0

    JNP

    JPE

    使用无符号数比较的JCC指令

    指 令

    描 述

    条 件

    别 名

    相反指令

    JA

    如果超过(>)则跳转

    进位标志=0,0标志=0

    JNBE

    JNA

    JNBE

    如果不低于或等于(不 <=)则跳转

    进位标志=0,0标志=0

    JA

    JBE

    JAE

    如果超过或等于(>=)则跳转

    进位标志=0

    JNC,JNB

    JNAE

    JNB

    如果不低于则跳转(不 <)

    进位标志=0

    JNC,JAE

    JB

    JB

    如果低于(<)则跳转

    进位标志=1

    JC,JNAE

    JNB

    JNAE

    如果不超过或等于(不>=)则跳转

    进位标志=1

    JC,JB

    JAE

    JBE

    如果低于或等于(<=)则跳转

    进位标志=1或0标志=1

    JNA

    JNBE

    JNA

    如果不超过(不>)则跳转

    进位标志=1或0标志=1

    JBE

    JA

    JE

    如果相等(=)则跳转

    0标志=1

    JZ

    JNE

    JNE

    如果不相等(<>)则跳转

    0标志=0

    JNZ

    JE

    使用有符号数比较的JCC指令

    指 令

    描 述

    条 件

    别 名

    相反指令

    JG

    如果大于(>)则跳转

    符号标志=溢出标志或0标志=0

    JNLE

    JNG

    JNLE

    如果小于或等于(<=)则跳转

    符号标志=溢出标志或0标志=0

    JG

    JLE

    JGE

    如果大于或等于(>=)则跳转

    符号标志=溢出标志

    JNL

    JGE

    JNL

    如果不小于(不<)则跳转

    符号标志=溢出标志

    JGE

    JL

    JL

    如果小于(<)则跳转

    符号标志<>溢出标志

    JNGE

    JNL

    JNGE

    如果大于或等于(>=)跳转

    符号标志<>溢出标志

    JL

    JGE

    JLE

    如果小于或等于(<=)跳转

    符号标志<>溢出标志或0标志=1

    JNG

    JNLE

    JNG

    如果不大于(不>)则跳转

    符号标志<>溢出标志或0标志=1

    JLE

    JG

    JE

    如果等于(=)则跳转

    0标志=1

    JZ

    JNE

    JNE

    如果不等于(<>)则跳转

    0标志=0

    JNZ

    JE



    展开全文
  • ARM 汇编指令条件执行 在ARM模式下,任何一条数据处理指令可以选择是否根据操作的结果来更新CPSR寄存器中的ALU状态标志位。在数据处理指令中使用S后缀来实现该功能。 不要在CMP,CMN,TST或者TEQ指令中使用S后缀。...

     

     

    ARM 汇编指令条件执行

    在ARM模式下,任何一条数据处理指令可以选择是否根据操作的结果来更新CPSR寄存器中的ALU状态标志位。在数据处理指令中使用S后缀来实现该功能。 

    不要在CMP,CMN,TST或者TEQ指令中使用S后缀。这些比较指令总是会更新标志位。 

    在Thumb模式下,所有数据处理指令都更新CPSR中的标志位。有一个例外就是:当一个或更多个高寄存器被用在MOV和ADD指令时,此时MOV和ADD不能更新状态标志. 

    几乎所有的ARM指令都可以根据CPSR中的ALU状态标志位来条件执行。参见表2-1条件执行后缀表。 

    在ARM模式下,你可以: 

    • 根据数据操作的结果更新CPSR中的ALU状态标志;
    • 执行其他几种操作,但不更新状态标志;
    • 根据当前状态标志,决定是否执行接下来的指令。 

    在Thumb模式,大多数操作总是更新状态标志位,并且只能使用条件转移指令(B)来实现条件执行。该指令(B)的后缀和在ARM模式下是一样的。其他指令不能使用条件执行。

     

    ALU状态标志 

    CPSR寄存器包含下面的ALU状态标志:

      N       Set when the result of the operation was Negative
      Z Set when the result of the operation was Zero
      C Set when the operation result in a Carry(发生进位,或借位)
      V Set when the operation caused oVerflow(操作造成溢出)
      Q ARM architecture v5E only sticky flag

     

     

     

     

      

    2.5.2 执行条件

     N,Z,C,V相关的条件码后缀如下表所列:

    示例1

      ADD  r0, r1, r2              ; r0 = r1 + r2, 不更新标志位
      ADDS  r0, r1, r2      ; r0 = r1 + r2, 后缀S表示更新标志位
      ADCSS  r0, r1, r2      ; If C 标志为1,则执行r0 = r1 + r2, 且更新标志,
      CMP  r0, r1            ; CMP指令肯定会更新标志. 

    示例2 求最大公约数

    gcd
      CMP r0, r1    
      BEQ end    ; r0 = r0 结束程序
      BLT less    ; r0 < r1 跳转至 less
      SUB r0, r0, r1  ; r0 > r1时 r0 = r0 - r1
      B gcd  ; 条件都不满足是继续循环
    less
      SUB r1, r1, r0    ; r0 < r1 r1 = r1 - r0
      B gcd
    end

    示例3

    MAIN
      mov r1, #1   mov r2, #1   cmp r1, r2   beq FUNC      ;if(eq) b FUNC => 实质:if(z == 1) b FUNC   bne FUNC    ;实质:if(z == 0) b FUNC   mov r3, #3   mov r4, #4 FUNC   mov r5, #5   mov r6, #6

     

    寻址方式 

    基地址变址寻址方式 

    种类 格式 模式
    1 [Rn, #±<offset_12]> 立即数前索引寻址
    2 [Rn, ±Rm] 寄存器前索引寻址
    3 [Rn, Rm, <shift>#<offset_12>] 寄存器位移的前索引寻址
    4 [Rn, #±<offset_12>]! 立即数自动索引寻址
    5 [Rn, ±Rm]! 寄存器自动索引寻址
    6 [Rn, Rm, <shift<#<offset_12>]! 寄存器移位的自动索引寻址
    7 [Rn], #±<offset_12> 立即数后索引寻址
    8 [Rn], ±<Rm> 寄存器后索引寻址
    9 [Rn], ±<Rm>, <shift>#<offset_12> 带移位的寄存器后索引寻址

     

     

     

     

     

     

     

     

     

    寄存器前索引寻址

      mov r0, #0x40000000
      mov r1, #0xF000000F
      str r1, [r0, #4]  ;将 r1 中的数据存储到地址为 r0 + 4 的内存空间中

     寄存器移位的前索引寻址

      mov r2, #8
      str r1, [r0, r2, lsl #1]  ;将 r1 中的数据存储到地址为 r0 + (r2 << 1)的内存空间中

     寄存器后索引寻址

      str r1, [r0], #4  ;将 r1 中的数据存储到地址为 r0 的内存空间中,然后 r0 = r0 + 4

     寄存器自动索引寻址 

    str r1, [r0, #4]!  ;将 r1 中的数据存储到 r0 + 4 的内存空间中, 然后 r0 = r0 + 4

      多寄存器寻址/块拷贝寻址  LDM STM

    对栈进行操作是,使用较多  比如说 用 IA 自动索引寻址存,就用 DB 自动索引读

     

    Load/Store指令

    Load/store是一组内存访问指令,用来在ARM寄存器和内存之间进行数据传送,ARM指令中有3种基本的数据传送指令。

    1. 单寄存器 Load/Store 内存访问指令(single register):这些指令为ARM寄存器和存储器提供了更灵活的单数据项传送方式。数据可以使字节,16位半字或32位字
    2. 多寄存器 Load/Store 内存访问指令:可以实现大量数据的同时传送,主要用于进程的进入和退出、保存和恢复工作寄存器以及复制寄存器中的一片(一块)数据
    3. 但寄存器交换指令(single register swap): 实现寄存器数据和内存数据进行交换,而且是在一条指令中完成,执行过程中不会受到中断干扰

    单寄存器Load/Store指令

    LDR指令:用于从内存中将一个32位的字读取到目标寄存器  指令格式  LDR{<cond>} <Rd>, <addr_mode> 

    ;指令举例
      LDR R1, [R0, #0x12]  ;将R0 + 12地址处的数据读出,保存到R1中(R0保持不变)
      LDR Rd,[Rn], #0x04 ;立即数后索引寻址,Rn的值用作传输数据的存储地址。在数据传送后,将偏移量 0x04 与Rn相加,记过写回到 Rd中

     STR指令:用于将一个32位的字节数据写入到指令中指定的内存单元  指令格式  STR{<cond>} <Rd>,<addr_mode> 

    ;LOAD/STORE指令
    ;向内存写入数据 STR
    mov r0, #40000000
    mov r1, #ff000000
    str r1, [r0]  ;用于将一个32位的字数据写入到指令指定的内存单元(以 r0 值为起始地址的 4byte 内存单元)
    strb r1, [r0]  ;将r1 中的 [7:0]存储到 r0 对应的内存空间
    strh r1, [r0]  ;将r1 中的 [15:0]存储到 r0 为起始地址的两个字节的内存空间
              ;在对数据进行操作时,应根据数据本身的属性(几个字节)进行操作

     多寄存器Load/Store指令

    LDM指令:实现数据从连续的内存单元中读取到指令指定的寄存器列表中。值得注意的是 LDM指令和STM指令:序号的寄存器对应内存中高地址的数据

    指令格式: LDM{<cond>}<addressing_mode> <Rn>{!}, <registers> 

    STM指令:实现将指令中寄存器列表里的数值写入到一块连续的内存单元之中

    指令格式: STM{<cond>} <addressing_mode> <Rn>{!}, <register> 

    LDM/STM <cond>的几种寻址方式:

      格  式 地址变化格式  
    1 IA(Increment After) 后递增方式 先存储后增长
    2 IB(Increment Before) 先递增方式 现增长后存储
    3 DA(Decrement After) 后递减方式 先存储后递减
    4 DB(Decrement Before) 先递减方式 先递减后存储

       

     

     

     

     

    mov r0, #0x40000000
      mov r1, #1
      mov r2, #2
      mov r3, #3
      ldm r0, {r1-r3}
      stm r0, {r1-r3}  ;将 r1 - r3 寄存器(连续寄存器)中的数据存储到 以 r0 位起始地址的内存空间中
      stm r0, {r3, r1}   ;将 r1 、 r3 寄存器(不连续寄存器)中的数据存储到 以 r0 位起始地址的内存空间中
                ;批量操作时,低编号的寄存器数据对应内存中的低地址
      stm r0!, {r1-r3}  ;寄存器批量存储,也适用自动索引寻址, 操作完成后   r0 = r0 + (寄存器个数)*4

     

     跳转指令

    B和BL跳转指令

    MAIN
      mov r0, #2
      mov r1, #3
      mov lr, pc  ;B 指令不会自动保存 PC;手动保存返回地址、当前PC
      b lable    ;跳转到标号 FUNC (标号的实质是地址)
      mov r3, r0
    FUNC
      sub r0, r1, r0
      mov pc,lr  ;返回主程序继续执行

    跳转指令是改变指令执行顺序的标准方式 (控制流指令)

    B 和 BL 指令都是 相对跳转(短跳转) 指令,通过偏移量跳转, 最大跳转距离是 ±32M

    使用 mov pc, <>可以实现 对跳转(长跳转)(不会保存当前 PC 值)

    关于B指令和BL指令最大跳转距离是 ±32M:

      ARM汇编每条指令占用 4byte,生成机器码 B 、BL存放在bits[31:24], bits[23:0]是立即数空间,可以表示 2^24个地址。由于每条汇编指令占用4byte字节(最低两位都为 0),因此可以使用 24位二进制数来表示 26 位的寻址空间。

    B指令和BL指令的区别

    • B指令在使用时不会对当前 PC 值进行保存,为保证跳转指令执行后能正常返回,要手动对其进行保存
    • BL (带连接的跳转指令)能够在跳转时对当前 PC 值自动进行保存。 

     

    带状态切换的跳转指令 BX

    不会保存跳转前 PC 值 ±32M范围

    带状态切换(ARM&Thmub)的跳转指令BX  ,语法格式:BX{<cond>} <Rm> ,使程序跳转到指令中参数 Rm 指定的地址进行执行。并将 Rm 的第 0 位复制到 CPRS 中的 T 位, bit[31: 1]存入PC。

       PC也可以作为 Rm 寄存器使用,当PC作为 Rm 使用时,指令 BX PC 便跳转到当前指令下面第 2 条指令出执行(三级流水线:当前正在执行的指令地址为 PC - 8,正在译码的指令为 PC - 4, 正在取指的指令是 PC)。但这种方式不值得推荐,最好使用下面的方式完成这种跳转。

      mov pc, pc
    ;或者
      add pc, pc, #0

     

    带状态切换的连接跳转指令

     与BX功能一致,但会自动保存跳转时的 PC 值,语法格式: BLX <target_add> 。target_add为指令的跳转目标地址,该地址是一个立即数

     

    状态(寄存器)操作指令

    ARM指令集提供了两条指令(MSR,MRS),用来操作状态寄存器PSR

    MRS指令,语法格式 MRS {cond} Rd, PSR 用于把CPSR或SPSR的值传送到一个寄存器;

    MSR指令,语法格式 MSR {cond} PSR_filed, #immed_8r 或 MSR {cond} PSR_filed, Rm 用于把一个寄存器的值或一个立即数传送到CPSR或SPSR;使用这两条只能可以实现对程序状态寄存器的状态修改操作。

      在使用MSR指令对PSR进行修改操作时,要通过field设置状态寄存器需要操作的域。状态寄存器的32位被分为4个8位的域(filed)分别为:bits[31:24]条件域,用 F 表示; bits[23: 16]状态域,用 S 表示;bits[15:8]预留域,用 X 表示;bits[7:0]控制域,用 C 表示。

    ;程序举例:是能IRQ中断
    ENABLE_IRQ
      MRS  R0,CPSR  
      BIC   R0,R0,#080  ;将CPSR bit7 I 清零,是能IRQ
      MSR  CPSR_c,R0  ;典型的读-改-回写操作
      MOV   PC,LR

      

    异常产生指令

    ARM指令集提供了两条产生异常的指令(中断指令 SWI,断点中断指令 BKPT),通过这两条指令可以用软件的方法实现异常。 

    中断指令

    软件中断指令 SWI (software Interrupt)用于产生软中断,实现从用户模式切换到管理模式,CPSR保存到管理模式的 SPSR 中,执行转移到 SWI 向量。

    语法格式 SWI {<cond>} <immed_24>  immed_24 为中断号

     

     

     

    栈:按增长方向分为 递增栈;递减栈

    按压栈操作顺序(sp位置)分为;满栈和空栈

    满栈(FULL):sp指向栈顶元素

    空栈(EMPTY):sp指向栈顶元素相邻位置

    根据栈的不同分类,将其寻址方式分为以下4种

    1)满递减 FD(Full Descending)

    2)空递减 ED(Empty Descending)

    3)满递增 FA(Full Asceding)

    4)空递增 EA(Empty Ascending)

     习惯上大都使用满减栈。

    压栈出栈的几种操作方式 

      ;初始化栈 
      mov sp, #0x40000018
    MAIN
      mov r0, #1
      mov r1, #1
      bl FUNC          
      add r2, r0, r1
    FUNC
      ;压栈保护现场
      stmfd sp!, {r0, r1}
      mov r0, #2
      mov r1, #4
      sub r2, r1, r0
      ;出栈恢复现场
      ldmfd sp!, {r0, r1}
      mov pc, lr   
    
    ;初始化栈 
    MAIN
      mov r0, #1
      mov r1, #1
      bl FUNC          
      add r2, r0, r1
    FUNC
      ;压栈保护现场
      stmfd sp!, {r0, r1, lr}
      mov r0, #2
      mov r1, #4
      sub r2, r1, r0
      ;出栈恢复现场
      ldmfd sp!, {r0, r1, pc}   

     

     

     

    swp r0, r1, [r2]
     ;将r0中的数据放入内存地址是r2的地址空间,同时将r2中的值放入r1寄存器
     ;处理器与内存之间进行数据交换  交换过程不会被打断

     

    转载于:https://www.cnblogs.com/chen-farsight/p/6068905.html

    展开全文
  • 在汇编指令中跳转指令...对于有条件跳转指令通常都是根据FLAG寄存器的相关状态值SF,OF,AF,PF,CF是否被设置为1或者是0来进行跳转的选择,这个就可以实现相关的分支语句。类似于高级语言中的if等。 (1)无条件跳转指令
  • 关于汇编跳转指令的说明

    千次阅读 2014-04-25 15:00:02
    条件跳转指令是创建循环和实现其他条件执行语句,如if…endif的基本要素。 条件跳转指令检查一个或多个标志位,判断它们是否匹配某个特殊条件(就像setcc指令):如果标志匹配成功,该指令就将控制转移到目标位置;...
  • 汇编跳转指令(转载)

    千次阅读 2016-03-29 17:29:35
    关于 汇编的跳转指令,大家应该都有所体会比较多 而且比较乱 不容易记 ...条件跳转指令是创建循环和实现其他条件执行语句,如if…endif的基本要素。 条件跳转指令检查一个或多个标志位,判断它们是否匹配某个特殊条件
  • 这一讲我们细讲计算机中关于if...else条件判断语句的指令实现。 1)CPU是如何执行指令的? 拿我们用的Intel CPU来说,里面差不多有几百亿个晶体管。实际上,一条条计算机指令执行起来非常复杂。好在CPU在软件层面...
  • 条件跳转指令是创建循环和实现其他条件执行语句,如if…endif的基本要素。 条件跳转指令检查一个或多个标志位,判断它们是否匹配某个特殊条件(就像setcc指令):如果标志匹配成功,该指令就将控制转移到目标位置;...
  • 文章目录ARM指令数据处理指令数据处理指令机器码格式数据...算术指令跳转指令汇编实现下面功能汇编实现求最大公约数?(如9 15 值是3)实现 延时1秒函数Load/Store 指令前索引/后索引寻址GNU 汇编伪指令批量操作指令堆...
  • 指令周期分为取指令子周期、执行指令子周期和中断子周期。 介绍无条件跳转指令jmp,条件跳转指令jcxz,循环指令loop,实现子程序设计的call和ret/retf指令。
  • 跳转(B)和跳转连接(BL)指令是改变指令执行顺序的标准方式。ARM 一般按照字地址顺序执行指令,需要时使用条件执行跳过某段指令。只要程序必须偏离顺序执行,就要使用控制流指令来修改程序计数器。尽管在特定情况...
  • 默认情况下,CPU加载程序并按顺序执行...汇编语言程序使用条件处理指令实现高级语言中的条件处理(IF)语句和循环语句。每种条件处理语句都有可能导致控制转移到(跳转到)内存中的一个新地址处。控制转移(transfer of co
  • 条件跳转指令 标志扩展名格式 一些MIPS指令要求将I格式指令的16位立即数字段(存储在位0到15中)符号扩展为完整的32位宽度。 符号扩展的确切方式取决于要执行的指令类型,如下所示。 数据路径设计 组件说明 PC...
  • 条件跳转指令和其他DMIS控制程序流程的语句稍微有些不同,因为即使程序没有条件语句跳转还是会执行。 JUMPTO语句 JUMPTO语句用来引导程序运行到新的一行,这一行用标签识别,格式如下: JUMPTO/(标签) 标签:程序...
  • 如果是循环,我们就要想办法在执行完一次循环就跳转到循环开始,同时改变一些条件,方便进行跳出循环。 再加上初始值,循环三要素就出来了。 如果是if_else,那么我们就需要进行判断,然后选择我们要执行的代码,...
  • 条件跳转指令如je、jg、bgt等,都是通过cmp比大小实现的 cmp op1 op2 无符号数cmp 用到ZF和CF ①当ZF=1,说明op1=op2 ②当ZF=0,CF=1时,有借位,op1<op2 ③当ZF=0,CF=0时,无借位,op1>op2 有符号数cmp 用到...
  • 转移指令包括跳转、分支两种,区别在于前者是绝对转移,后者是相对转移,但实现方法是相似的。转移指令设计延迟槽 8.1 延迟槽 第五章介绍了流水线中存在的三种相关:数据相关、结构相关、控制相关。 其中控制相关...
  • 条件分支的实现方法同循环处理的实现方法类似,使用的也是cmp指令和跳转指令,这一点估计大家也预料到了。 没错,条件分支就是利用这些指令来实现的。不过,为了以防万一,我们来确认一下。代码清单10-11是,根据...
  • 跳转用来控制程序的指令流程。Lua使用OP_JMP指令来执行一个跳转,有关OP_JMP的详细...跳转可以分为条件跳转和非条件跳转。非条件跳转比较简单,我们可以先从这里入手。 goto 在Lua5.2中,goto和label是新加入的sta...
  • RewriteCond 和RewriteRule Apache的Mod_rewrite学习 (RewriteCond重写规则的条件)收藏RewriteCond Syntax: ... RewriteCond指令定义一条规则条件。在一条RewriteRule指令前面可能会有...
  • 这是个跳转指令,将指定寄存器的值,放入PC中,是无条件跳转。 我们需要 更新PC,加一个多路选择器,实现+4和PC <- (reg)两种选择 增加控制信号Jrn,标识jr指令 2 新的数据通路 3 器件修改 控制器,控制信号...
  • 条件跳转指令是创建循环和实现其他条件执行语句,如if…endif的基本要素。 条件跳转指令检查一个或多个标志位,判断它们是否匹配某个特殊条件(就像setcc指令):如果标志匹配成功,该指令就将控制转移到目标位置;...
  • 后缀B 后缀 / H 后缀T 后缀条件后缀指令类型跳转指令实现跳转的两种方法跳转指令的编码B 指令BL 指令BX指令 ARM指令 指令分区 ARM指令代码一般可以分为五个域 条件码域[31:28] ,4位条件码共有16种组合 指令代码...

空空如也

空空如也

1 2 3 4 5 ... 16
收藏数 318
精华内容 127
关键字:

条件跳转指令实现