SWI中的条件位(ARM指令)

时间:2013-11-06 05:25:05

标签: assembly arm

在ARM SWI指令中,32位分为3组:0:23(系统调用号),24:27(0b1111)和28:31(条件)。 条件是什么?

“ARM SoC架构”一书提到“如果条件通过则指令进入管理员模式。”当我检查示例代码时,示例在SWI之前有一个CMP条件,但我是仍然无法理解病情的原因。此外,互联网上出现的关于“SWI for ARM”的几个演讲在SWI之前没有任何CMP条件。所以我很困惑,无论我们是否需要,如果是,那么需要什么呢?

请提前帮助和致谢。

1 个答案:

答案 0 :(得分:2)

这是一个基本的ARM概念。尝试google ARM conditional execution OR instructions。例如,今天Dave's space post给出了这个概念的一个很好的概述。同样,the Wikipedia article引用的Stackoverflow ARM wiki也包含有关此主题的信息。

简而言之,ARM有四个条件位或标志 NZCV note ;这些是任何汇编程序/机器语言的标准概念。他们是,

  1. N 表示否定。
  2. Z 为零。
  3. C for carry。
  4. V 溢出。
  5. ARM有16个条件执行前缀,用4位字段表示,用于测试条件位的变化,

    • 0000 - EQ表示设置标志的等于
    • 0001 - NE含义不等于 Zero 清除。
    • 0010 - CS含义携带HS含义无符号更高或 Carry 设置。< / LI>
    • 0011 - CC含义明确LO含义无符号下限 Carry 清除。
    • 0100 - MI表示设置了否定标志的减号否定
    • 0101 - PL表示加号(包括零),否定标志清除。
    • 0110 - VS表示设置了溢出标志的溢出
    • 0111 - VC含义无溢出溢出清除。
    • 1000 - HI表示无符号高位 进位设置 AND 清除。< / LI>
    • 1001 - LS含义无符号低或相同 进位清除 AND 设置。
    • 1010 - GE表示签名大于或等于否定等于溢出
    • 1011 - LT含义签名小于 否定不等于溢出
    • 1100 - GT表示签名大于 清除 AND 否定等于溢出
    • 1101 - LE含义签名小于或等于 设置 AND 否定不等于溢出
    • 1110 - AL含义始终。如果汇编程序中没有条件部分,则使用此编码。
    • 1111 - NV;这是历史性的并且已弃用,但对于ARMv3,它意味着从不。即nop。对于较新的ARM(ARMv5 +),这扩展了操作码范围。

    几乎所有 ARM 指令都以此四位字段为前缀。这不适用于 Thumb Thumb2 说明。在统一汇编程序( Thumb2 ARM 的汇编)中,使用了IT prefix

    示例可能如下。你有这个'C'代码,

     if(size > 0)
        write(fd, buffer, size);
    

    呼叫write()是OS呼叫。以下是一些示例汇编程序,

     ; fd is in r0, buffer in r1, size in r2
    
     cmp  r2, #0         ; if(size > 0)
     movgt r7, #NR_write ; OS constant for write().
     swigt #0            ; call OS write() if(size > 0)
    
     ; code resumes here whether or not the OS was called.
    

    ARM条件有很多other uses

    注意:所有现代ARM CPU都有 Q (饱和度)标志。它的行为方式不同,因为它是指令集的扩展。