【问题标题】:Condition bits in SWI (ARM Instruction)SWI 中的条件位(ARM 指令)
【发布时间】:2013-11-06 05:25:05
【问题描述】:

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

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

请帮助并提前致谢。

【问题讨论】:

  • 每条手臂指令都有一个条件。大多数时候它是 0b1110 (0xE),这意味着总是。一如既往地运行。
  • 但是条件的用途是什么,它的工作是使条件0xE。这些只是填充位吗?
  • 每条指令都有一个条件 ADDEQ add if equal, vs ADD, always。 SWILT SWI 如果小于,SWIEQ,SWI 如果相等。 SUBGT, sub if greater than 等。编写代码是程序员的工作,程序员选择何时使指令有条件。
  • 填充位通常被标记为 SBZ(应该为零),并且没有另外记录。条件位非常真实,经常使用,通常与分支 blt、beq 等一起使用,但与 arm 一起可用于任何指令以提高性能。
  • @dwelch 非常感谢,现在我明白了。您想说每条指令都有一个可以明确提及的条件(例如 ADDEQ、ADDGT 等),有些是隐含的(ADD - 总是)。在这里也是一样的。再次感谢。它真的很有帮助,我学到了新东西。

标签: assembly arm


【解决方案1】:

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

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

  1. N 表示否定。
  2. Z 为零。
  3. C 用于携带。
  4. V 表示溢出。

ARM 有 16 个条件执行前缀,表示在一个四位字段中,用于测试条件位的变化,

  • 0000 - EQ 表示 Equal 并设置了 Zero 标志。
  • 0001 - NE 表示 不等于 明确。
  • 0010 - CS 表示 Carry 集HS 表示 无符号更高或相同Carry 集。
  • 0011 - CC 意思是 Carry clearLO 意思是 unsigned lowerCarry clear。
  • 0100 - MI 表示 Minusnegative 并设置了 Negative 标志。
  • 0101 - PL 表示 加号(包括零),负号标志清零。
  • 0110 - VS 表示 Overflow 并设置了 Overflow 标志。
  • 0111 - VC 表示没有溢出溢出清晰。
  • 1000 - HI 表示 Unsigned HigherCarry 设置 AND Zero 清晰。
  • 1001 - LS 表示无符号较低或相同进位清除AND 集。李>
  • 1010 - GE 表示签名大于或等于负数等于溢出
  • 1011 - LT 表示 Signed less than with Negative 不等于 Overflow
  • 1100 - GT 表示符号大于明确AND 等于溢出。
  • 1101 - LE 意思是 小于或等于 设置 AND 不等于溢出
  • 1110 - AL 意思是总是。如果汇编程序中没有条件部分,则使用此编码。
  • 1111 - NV;这是历史性的且已弃用,但对于 ARMv3,它意味着从不。即nop。对于较新的 ARM (ARMv5+),这扩展了操作码范围。

几乎所有ARM指令都以这四位字段为前缀。这不适用于 ThumbThumb2 说明。在统一汇编器中(为 Thumb2ARM 汇编),使用 IT prefix

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

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

调用write() 是操作系统调用。以下是一些示例汇编器,

 ; 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(饱和)标志。它的行为方式不同,因为它是指令集的扩展。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-17
    • 1970-01-01
    • 2015-08-22
    • 1970-01-01
    • 1970-01-01
    • 2023-01-31
    • 2014-04-05
    • 1970-01-01
    相关资源
    最近更新 更多