1

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

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

请提前帮助和感谢。

4

1 回答 1

2

这是一个基本的 ARM 概念。尝试谷歌 ARM 条件执行或指令。例如,今天戴夫的太空帖子很好地概述了这个概念。同样,从Stackoverflow ARM wiki引用的 Wikipedia 文章也包含有关此主题的信息。

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

  1. N为负数。
  2. Z为零。
  3. C为携带。
  4. V表示溢出。

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

  • 0000 -EQ表示设置为零标志的等于。
  • 0001 -表示NE等于清零
  • 0010 -CS表示进位集HS表示无符号更高或进位集相同。
  • 0011 -CC表示进位清零LO符号低位进位清零。
  • 0100 -MI表示 设置了标志的负数负数。
  • 0101 -PL表示加号(包括零),负号标志清零。
  • 0110 -VS表示设置了溢出标志的溢出。
  • 0111 -VC表示没有溢出溢出清除。
  • 1000 -HI表示带有位设置清除的无符号更高。
  • 1001 -LS表示 符号较低或相同,带有清零 零集。
  • 1010 -GE表示 有符号大于或等于负数等于溢出
  • 1011 -LT表示 有符号小于负数不等于溢出
  • 1100 -GT表示 有符号大于清除 等于溢出。
  • 1101 -LE表示 有符号小于或等于零设置且负数 等于溢出
  • 1110——AL意思是 永远。如果汇编程序中没有条件部分,则使用此编码。
  • 1111 - NV; 这是历史性的并且已被弃用,但对于 ARMv3,它意味着never。即一个nop。对于较新的 ARM (ARMv5+),这扩展了操作码范围。

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

一个例子可能如下。你有这个'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 条件句还有许多其他用途

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

于 2013-11-07T16:10:12.117 回答