在ARM SWI指令中,32位分为3组:0:23(系统调用号),24:27(0b1111)和28:31(条件)。 条件是什么?
“ARM SoC架构”一书提到“如果条件通过则指令进入管理员模式。”当我检查示例代码时,示例在SWI之前有一个CMP条件,但我是仍然无法理解病情的原因。此外,互联网上出现的关于“SWI for ARM”的几个演讲在SWI之前没有任何CMP条件。所以我很困惑,无论我们是否需要,如果是,那么需要什么呢?
请提前帮助和致谢。
答案 0 :(得分:2)
这是一个基本的ARM概念。尝试google ARM conditional execution OR instructions。例如,今天Dave's space post给出了这个概念的一个很好的概述。同样,the Wikipedia article引用的Stackoverflow ARM wiki也包含有关此主题的信息。
简而言之,ARM有四个条件位或标志 NZCV note ;这些是任何汇编程序/机器语言的标准概念。他们是,
ARM有16个条件执行前缀,用4位字段表示,用于测试条件位的变化,
EQ
表示设置零标志的等于。NE
含义不等于 Zero 清除。CS
含义携带或HS
含义无符号更高或 Carry 设置。< / LI>
CC
含义明确或LO
含义无符号下限 Carry 清除。 MI
表示设置了否定标志的减号或否定。PL
表示加号(包括零),否定标志清除。VS
表示设置了溢出标志的溢出。VC
含义无溢出,溢出清除。HI
表示无符号高位 进位设置 AND 零清除。< / LI>
LS
含义无符号低或相同 进位清除 AND 零设置。 GE
表示签名大于或等于且否定等于溢出。LT
含义签名小于 否定不等于溢出。GT
表示签名大于 零清除 AND 否定等于溢出LE
含义签名小于或等于 零设置 AND 否定不等于溢出。AL
含义始终。如果汇编程序中没有条件部分,则使用此编码。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 (饱和度)标志。它的行为方式不同,因为它是指令集的扩展。