|
发表于 2024-9-27 20:59:39
|
显示全部楼层
在Keil MDK上测试发现实现的效率很低。
C程序:
- unsigned int Var32_1,Var32_2;
- ldiv_t ldiv_test;
- void Ldiv_Test(void)
- {
- Var32_1=0x12345678;
- Var32_2=0x98765;
- ldiv_test = ldiv(Var32_1, Var32_2);
- }
复制代码 汇编程序:
- Ldiv_Test PROC
- PUSH {r2-r4,lr}
- LDR r4,|L0.32|
- LDR r2,|L0.36|
- LDR r1,|L0.28|
- STRD r1,r2,[r4,#0]
- MOV r0,sp
- BL ldiv
- LDRD r0,r1,[sp,#0]
- STRD r0,r1,[r4,#8]
- POP {r2-r4,pc}
- ENDP
- |L0.28|
- DCD 0x12345678
- |L0.32|
- DCD ||.data||
- |L0.36|
- DCD 0x00098765
- AREA ||.arm_vfe_header||, DATA, READONLY, NOALLOC, ALIGN=2
- DCD 0x00000000
- AREA ||.data||, DATA, ALIGN=2
- Var32_1
- DCD 0x00000000
- Var32_2
- DCD 0x00000000
- ldiv_test
- % 8
复制代码 看起来汇编程序行数很少,但是其中的ldiv子程序很长:
- 0x00000154 B510 PUSH {r4,lr}
- 0x00000156 460B MOV r3,r1
- 0x00000158 4604 MOV r4,r0
- 0x0000015A 4611 MOV r1,r2
- 0x0000015C 4618 MOV r0,r3
- 0x0000015E F000F803 BL.W 0x00000168 __aeabi_idiv
- 0x00000162 E9C40100 STRD r0,r1,[r4,#0]
- 0x00000166 BD10 POP {r4,pc}
- 0x00000168 B570 PUSH {r4-r6,lr}
- 0x0000016A 2400 MOVS r4,#0x00
- 0x0000016C 4625 MOV r5,r4
- 0x0000016E 2800 CMP r0,#0x00
- 0x00000170 DA01 BGE 0x00000176
- 0x00000172 2401 MOVS r4,#0x01
- 0x00000174 4240 RSBS r0,r0,#0
- 0x00000176 2900 CMP r1,#0x00
- 0x00000178 DA01 BGE 0x0000017E
- 0x0000017A 2501 MOVS r5,#0x01
- 0x0000017C 4249 RSBS r1,r1,#0
- 0x0000017E F000F819 BL.W 0x000001B4 __aeabi_uidiv
- 0x00000182 42AC CMP r4,r5
- 0x00000184 D000 BEQ 0x00000188
- 0x00000186 4240 RSBS r0,r0,#0
- 0x00000188 2C00 CMP r4,#0x00
- 0x0000018A D000 BEQ 0x0000018E
- 0x0000018C 4249 RSBS r1,r1,#0
- 0x0000018E BD70 POP {r4-r6,pc}
- 0x00000190 4C06 LDR r4,[pc,#24] ; @0x000001AC
- 0x00000192 4D07 LDR r5,[pc,#28] ; @0x000001B0
- 0x00000194 E006 B 0x000001A4
- 0x00000196 68E0 LDR r0,[r4,#0x0C]
- 0x00000198 F0400301 ORR r3,r0,#0x01
- 0x0000019C E8940007 LDM r4,{r0-r2}
- 0x000001A0 4798 BLX r3
- 0x000001A2 3410 ADDS r4,r4,#0x10
- 0x000001A4 42AC CMP r4,r5
- 0x000001A6 D3F6 BCC 0x00000196
- 0x000001A8 F7FFFFB8 BL.W 0x0000011C __main_after_scatterload
- 0x000001AC 5B6C DCW 0x5B6C
- 0x000001AE 0000 DCW 0x0000
- 0x000001B0 5B8C DCW 0x5B8C
- 0x000001B2 0000 DCW 0x0000
- 0x000001B4 B530 PUSH {r4-r5,lr}
- 0x000001B6 460B MOV r3,r1
- 0x000001B8 4601 MOV r1,r0
- 0x000001BA 2000 MOVS r0,#0x00
- 0x000001BC 2220 MOVS r2,#0x20
- 0x000001BE 2401 MOVS r4,#0x01
- 0x000001C0 E009 B 0x000001D6
- 0x000001C2 FA21F502 LSR r5,r1,r2
- 0x000001C6 429D CMP r5,r3
- 0x000001C8 D305 BCC 0x000001D6
- 0x000001CA FA03F502 LSL r5,r3,r2
- 0x000001CE 1B49 SUBS r1,r1,r5
- 0x000001D0 FA04F502 LSL r5,r4,r2
- 0x000001D4 4428 ADD r0,r0,r5
- 0x000001D6 1E15 SUBS r5,r2,#0
- 0x000001D8 F1A20201 SUB r2,r2,#0x01
- 0x000001DC DCF1 BGT 0x000001C2
- 0x000001DE BD30 POP {r4-r5,pc}
复制代码 这可能与ldiv的参数是两个long型变量有关,实际上,我们常用的是unsigned int变量(32位无符号变量)。
|
|