我在试图理解这段简单的代码时有点卡住了。它在 R0 中得到一个数字。第一部分似乎是 R0 = abs(R0),但随后变得更加困难。确定前导零的数量,然后将其左移那么多位,然后检查它是否 > 0,否则返回 0。我不明白整个移位的目的应该是什么,以及添加和附加移位操作应该在那里做什么。
ROM:0005B7BE ; =============== S U B R O U T I N E =======================================
ROM:0005B7BE
ROM:0005B7BE
ROM:0005B7BE sub_5B7BE
ROM:0005B7BE ANDS.W R2, R0, #0x80000000
ROM:0005B7C2 IT MI
ROM:0005B7C4 NEGMI R0, R0
ROM:0005B7C6 CLZ.W R3, R0
ROM:0005B7CA LSLS.W R1, R0, R3
ROM:0005B7CE BEQ retZero
ROM:0005B7D0 RSB.W R3, R3, #29
ROM:0005B7D4 ADD.W R3, R3, #1024
ROM:0005B7D8 MOV.W R0, R1,LSL#21
ROM:0005B7DC ADD.W R2, R2, R3,LSL#20
ROM:0005B7E0 ADD.W R1, R2, R1,LSR#11
ROM:0005B7E4 BX LR
ROM:0005B7E6 ; ---------------------------------------------------------------------------
ROM:0005B7E6
ROM:0005B7E6 retZero
ROM:0005B7E6 MOV.W R0, #0
ROM:0005B7EA BX LR
ROM:0005B7EA ; End of function sub_5B7BE