-
Notifications
You must be signed in to change notification settings - Fork 1.6k
Closed
Labels
Description
There seems to be an issue with update_flags on some ARM instruction (at least for ADC and SBC). More precisely, Capstone reports update_flags as true when it should be false (according to ARM reference manual).
The following code snippet shows the issue:
from capstone import *
from capstone.arm import *
CODE = [
b"\x03\x00\xa1\xe0", # adcal r0, r1, r3
b"\x03\x00\xb1\xe0", # adcsal r0, r1, r3
b"\x03\x00\xc1\xe0", # sbcal r0, r1, r3
b"\x03\x00\xd1\xe0", # sbcsal r0, r1, r3
b"\x03\x00\x81\xe0", # addal r0, r1, r3
b"\x03\x00\x91\xe0", # addsal r0, r1, r3
b"\x03\x00\x41\xe0", # subal r0, r1, r3
b"\x03\x00\x51\xe0", # subsal r0, r1, r3
]
md = Cs(CS_ARCH_ARM, CS_MODE_ARM)
md.detail = True
for code in CODE:
for i in md.disasm(code, 0x1000):
print("{} {} ; update_flags: {}".format(i.mnemonic, i.op_str, i.update_flags))Output:
adc r0, r1, r3 ; update_flags: True
adcs r0, r1, r3 ; update_flags: True
sbc r0, r1, r3 ; update_flags: True
sbcs r0, r1, r3 ; update_flags: True
add r0, r1, r3 ; update_flags: False
adds r0, r1, r3 ; update_flags: True
sub r0, r1, r3 ; update_flags: False
subs r0, r1, r3 ; update_flags: TrueHere update_flags is true for ADC and SBC when it should be false (generally, it should only report true for those instructions with the s suffix). Notice that this does not happen with neither ADD nor SUB.