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 微控制器架构。有所谓的 MRS 和 MSR 指令。 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
我在 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 微控制器架构。有所谓的 MRS 和 MSR 指令。 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