ARM程序集如何只设置溢出标志?

How to set only the overflow flag ARM assembly?

我在 Raspberry PI 上学习 ARM 汇编时一直在摆弄 Flags。我已经设计出仅设置零标志、负标志和进位标志的方法。但是我想不出只设置溢出标志的方法。可能吗?如有任何帮助,我们将不胜感激!

挑战是不要写入 cpsr(由于各种原因不允许我这样做,否则那将是最好的解决方案,因为这是最好的解决方案)

编辑:仅设置溢出标志与所有其他 zero/clear。仅使用算术或移位。 NZCV = 0001

Edit2:为了进一步澄清,我认为需要多条指令才能实现。

abc cr
000 00 
001 01  x
010 01 
011 10 
100 01 
101 10 
110 10  x
111 11 

有符号溢出是进位不等于进位。如果第一列是操作数 a b 的 msbits 并进位到 msbit(其他位对有符号或无符号溢出无关紧要),则正确的列是进位出来和结果。如果结果为 1,那么您将获得 N 位。所以它必须是操作数的 msbits 是 1 并且进位是 0

0xxx (carrys)
1xxx (operand a)
1xxx (operand b)

0x80 + 0x80 = 0x00 (zero flag)
0x81 + 0x81 = 0x02 (need some other ones)

  100000010
   10000001
+  10000001
============
   00000010

-127 + -127 = -254 你能得到的最大负数是-128, 0x80,所以这是一个有符号溢出。

但是没有进位。

所以减法可能会起作用 -127 - 127

  100000011
   10000001
+  10000000
============
   00000010

但是作为减法,它会将进位反转为借位,在进位中留下 0 吗?这不是 ARM 的工作方式,其他 processors/cores 会这样做。

因此,为了能够做到这一点,您需要一个处理器将进位定义为减法的借位(在加法结束时反转进位)

您在撰写本文时编辑了您的问题,移位操作将如何修改带符号的溢出?需要加或减(需要使用加法器)

我没有看到只有一条指令的明显方法,但您可以结合使用。例如:

mov  r0, #0x80000000
mov  r1, #0x00000001
subs r2, r0, r1  ; C and V set
mov  r3, #0x10
asrs r3, #1      ; C cleared, V not changed

我对汇编比较陌生,在进行实验和研究时,我发现了以下设置单个标志的方法。请注意,我使用的是基于 ARM7TDMI-S 的 32 位 RISC 微控制器架构。有所谓的 MRSMSR 指令。 MRS用于读取标志,MSR用于写入标志。


以下是我设置每个标志的方式:

msr cpsr_cxsf, #0x80000000 ; N Flag
    
msr cpsr_cxsf, #0x40000000 ; Z flag
    
msr cpsr_cxsf, #0x20000000 ; C Flag
    
msr cpsr_cxsf, #0x10000000 ; V Flag