📄 lib_mem.lst
字号:
344 *
345 * size Number of data buffer octets to compare.
346 *
347 * Return(s) : DEF_YES, if 'size' number of data octets are identical in both memory buffers.
348 *
349 * DEF_NO, otherwise.
350 *
351 * Caller(s) : various.
352 *
353 * Note(s) : (1) Null compares allowed (i.e. 0-octet size); 'DEF_YES' returned to indicate identical
354 * null compare.
355 *
356 * (2) Many memory buffer comparisons vary ONLY in the least significant octets -- e.g.
357 * network address buffers. Consequently, memory buffer comparison is more efficient
358 * if the comparison starts from the end of the memory buffers which will abort sooner
359 * on dissimilar memory buffers that vary only in the least significant octets.
360 *
361 * (3) For best CPU performance, optimized to fill data buffer using 'CPU_ALIGN'-sized data words.
362 *
363 * (a) Since many word-aligned processors REQUIRE that multi-octet words be accessed on
364 * word-aligned addresses, 'CPU_ALIGN'd words MUST be accessed on 'CPU_ALIGN'd addresses.
365 *
366 * (4) Modulo arithmetic is used to determine whether a memory buffer starts on a 'CPU_ALIGN'
367 * address boundary.
368 *
369 * Modulo arithmetic in ANSI-C REQUIREs operations performed on integer values. Thus,
370 * address values MUST be cast to an appropriately-sized integer value PRIOR to any
371 * mem_align_modulo arithmetic operation.
372 ********************************************************************************************************
373 */
374 /*$PAGE*/
\ In segment CODE, align 4, keep-with-next
375 CPU_BOOLEAN Mem_Cmp (void *p1_mem,
376 void *p2_mem,
377 CPU_SIZE_T size)
378 {
\ Mem_Cmp:
\ 00000000 F04F2DE9 PUSH {R4-R11,LR}
\ 00000004 04D04DE2 SUB SP,SP,#+4
\ 00000008 0030B0E1 MOVS R3,R0
379 CPU_SIZE_T size_rem;
380 CPU_ALIGN *p1_mem_align;
381 CPU_ALIGN *p2_mem_align;
382 CPU_INT08U *p1_mem_08;
383 CPU_INT08U *p2_mem_08;
384 CPU_INT08U i;
385 CPU_INT08U mem_align_modulo_1;
386 CPU_INT08U mem_align_modulo_2;
387 CPU_BOOLEAN mem_aligned;
388 CPU_BOOLEAN mem_cmp;
389
390
391 if (size < 1) { /* See Note #1. */
\ 0000000C 000052E3 CMP R2,#+0
\ 00000010 0100001A BNE ??Mem_Cmp_0
392 return (DEF_YES);
\ 00000014 0100A0E3 MOV R0,#+1
\ 00000018 550000EA B ??Mem_Cmp_1
393 }
394 if (p1_mem == (void *)0) {
\ ??Mem_Cmp_0:
\ 0000001C 000053E3 CMP R3,#+0
\ 00000020 0100001A BNE ??Mem_Cmp_2
395 return (DEF_NO);
\ 00000024 0000A0E3 MOV R0,#+0
\ 00000028 510000EA B ??Mem_Cmp_1
396 }
397 if (p2_mem == (void *)0) {
\ ??Mem_Cmp_2:
\ 0000002C 000051E3 CMP R1,#+0
\ 00000030 0100001A BNE ??Mem_Cmp_3
398 return (DEF_NO);
\ 00000034 0000A0E3 MOV R0,#+0
\ 00000038 4D0000EA B ??Mem_Cmp_1
399 }
400
401
402 mem_cmp = DEF_YES;
\ ??Mem_Cmp_3:
\ 0000003C 0100A0E3 MOV R0,#+1
\ 00000040 00B0B0E1 MOVS R11,R0
403 size_rem = size;
\ 00000044 02C0B0E1 MOVS R12,R2
404 /* Start @ end of mem bufs (see Note #2). */
405 p1_mem_08 = (CPU_INT08U *)p1_mem + size;
\ 00000048 030092E0 ADDS R0,R2,R3
\ 0000004C 0060B0E1 MOVS R6,R0
406 p2_mem_08 = (CPU_INT08U *)p2_mem + size;
\ 00000050 010092E0 ADDS R0,R2,R1
\ 00000054 0070B0E1 MOVS R7,R0
407 /* See Note #4. */
408 mem_align_modulo_1 = (CPU_INT08U )((CPU_ADDR)p1_mem_08 % sizeof(CPU_ALIGN));
\ 00000058 030016E2 ANDS R0,R6,#0x3 ;; Zero extend
\ 0000005C 0090B0E1 MOVS R9,R0
409 mem_align_modulo_2 = (CPU_INT08U )((CPU_ADDR)p2_mem_08 % sizeof(CPU_ALIGN));
\ 00000060 03E017E2 ANDS LR,R7,#0x3 ;; Zero extend
\ 00000064 00E0CDE5 STRB LR,[SP, #+0]
410
411 mem_aligned = (mem_align_modulo_1 == mem_align_modulo_2) ? DEF_YES : DEF_NO;
\ 00000068 0000DDE5 LDRB R0,[SP, #+0]
\ 0000006C FF9019E2 ANDS R9,R9,#0xFF ;; Zero extend
\ 00000070 000059E1 CMP R9,R0
\ 00000074 0100001A BNE ??Mem_Cmp_4
\ 00000078 01A0A0E3 MOV R10,#+1
\ 0000007C 000000EA B ??Mem_Cmp_5
\ ??Mem_Cmp_4:
\ 00000080 00A0A0E3 MOV R10,#+0
412
413 if (mem_aligned == DEF_YES) { /* If mem bufs' alignment offset equal, ... */
\ ??Mem_Cmp_5:
\ 00000084 FFA01AE2 ANDS R10,R10,#0xFF ;; Zero extend
\ 00000088 01005AE3 CMP R10,#+1
\ 0000008C 2900001A BNE ??Mem_Cmp_6
414 /* ... optimize cmp for mem buf alignment. */
415 if (mem_align_modulo_1 != 0) { /* If trailing octets avail, ... */
\ 00000090 FF9019E2 ANDS R9,R9,#0xFF ;; Zero extend
\ 00000094 000059E3 CMP R9,#+0
\ 00000098 1200000A BEQ ??Mem_Cmp_7
416 i = mem_align_modulo_1;
\ 0000009C 0980B0E1 MOVS R8,R9
417 while ((mem_cmp == DEF_YES) && /* ... cmp mem bufs while identical & ... */
418 (size_rem > 0) && /* ... start mem buf cmp with trailing octets ... */
419 (i > 0)) { /* ... until next CPU_ALIGN word boundary. */
\ ??Mem_Cmp_8:
\ 000000A0 01005BE3 CMP R11,#+1
\ 000000A4 0F00001A BNE ??Mem_Cmp_7
\ 000000A8 00005CE3 CMP R12,#+0
\ 000000AC 0D00000A BEQ ??Mem_Cmp_7
\ 000000B0 FF8018E2 ANDS R8,R8,#0xFF ;; Zero extend
\ 000000B4 010058E3 CMP R8,#+1
\ 000000B8 0A00003A BCC ??Mem_Cmp_7
420 p1_mem_08--;
\ 000000BC 016056E2 SUBS R6,R6,#+1
421 p2_mem_08--;
\ 000000C0 017057E2 SUBS R7,R7,#+1
422 if (*p1_mem_08 != *p2_mem_08) { /* If ANY data octet(s) NOT identical, cmp fails. */
\ 000000C4 0000D6E5 LDRB R0,[R6, #+0]
\ 000000C8 00E0D7E5 LDRB LR,[R7, #+0]
\ 000000CC 0E0050E1 CMP R0,LR
\ 000000D0 0100000A BEQ ??Mem_Cmp_9
423 mem_cmp = DEF_NO;
\ 000000D4 0000A0E3 MOV R0,#+0
\ 000000D8 00B0B0E1 MOVS R11,R0
424 }
425 size_rem -= sizeof(CPU_INT08U);
\ ??Mem_Cmp_9:
\ 000000DC 01C05CE2 SUBS R12,R12,#+1
426 i--;
\ 000000E0 018058E2 SUBS R8,R8,#+1
\ 000000E4 EDFFFFEA B ??Mem_Cmp_8
427 }
428 }
429
430 if (mem_cmp == DEF_YES) { /* If cmp still identical, cmp aligned mem bufs. */
\ ??Mem_Cmp_7:
\ 000000E8 01005BE3 CMP R11,#+1
\ 000000EC 1100001A BNE ??Mem_Cmp_6
431 p1_mem_align = (CPU_ALIGN *)p1_mem_08; /* See Note #3a. */
\ 000000F0 0640B0E1 MOVS R4,R6
432 p2_mem_align = (CPU_ALIGN *)p2_mem_08;
\ 000000F4 0750B0E1 MOVS R5,R7
433
434 while ((mem_cmp == DEF_YES) && /* Cmp mem bufs while identical & ... */
435 (size_rem >= sizeof(CPU_ALIGN))) { /* ... mem bufs aligned on CPU_ALIGN word boundaries. */
\ ??Mem_Cmp_10:
\ 000000F8 01005BE3 CMP R11,#+1
\ 000000FC 0B00001A BNE ??Mem_Cmp_11
\ 00000100 04005CE3 CMP R12,#+4
\ 00000104 0900003A BCC ??Mem_Cmp_11
436 p1_mem_align--;
\ 00000108 044054E2 SUBS R4,R4,#+4
437 p2_mem_align--;
\ 0000010C 045055E2 SUBS R5,R5,#+4
438 if (*p1_mem_align != *p2_mem_align) { /* If ANY data octet(s) NOT identical, cmp fails. */
\ 00000110 000094E5 LDR R0,[R4, #+0]
\ 00000114 00E095E5 LDR LR,[R5, #+0]
\ 00000118 0E0050E1 CMP R0,LR
\ 0000011C 0100000A BEQ ??Mem_Cmp_12
439 mem_cmp = DEF_NO;
\ 00000120 0000A0E3 MOV R0,#+0
\ 00000124 00B0B0E1 MOVS R11,R0
440 }
441 size_rem -= sizeof(CPU_ALIGN);
\ ??Mem_Cmp_12:
\ 00000128 04C05CE2 SUBS R12,R12,#+4
\ 0000012C F1FFFFEA B ??Mem_Cmp_10
442 }
443
444 p1_mem_08 = (CPU_INT08U *)p1_mem_align;
\ ??Mem_Cmp_11:
\ 00000130 0460B0E1 MOVS R6,R4
445 p2_mem_08 = (CPU_INT08U *)p2_mem_align;
\ 00000134 0570B0E1 MOVS R7,R5
446 }
447 }
448
449 while ((mem_cmp == DEF_YES) && /* Cmp mem bufs while identical ... */
450 (size_rem > 0)) { /* ... for unaligned mem bufs or trailing octets. */
\ ??Mem_Cmp_6:
\ 00000138 01005BE3 CMP R11,#+1
\ 0000013C 0B00001A BNE ??Mem_Cmp_13
\ 00000140 00005CE3 CMP R12,#+0
\ 00000144 0900000A BEQ ??Mem_Cmp_13
451 p1_mem_08--;
\ 00000148 016056E2 SUBS R6,R6,#+1
452 p2_mem_08--;
\ 0000014C 017057E2 SUBS R7,R7,#+1
453 if (*p1_mem_08 != *p2_mem_08) { /* If ANY data octet(s) NOT identical, cmp fails. */
\ 00000150 0000D6E5 LDRB R0,[R6, #+0]
\ 00000154 00E0D7E5 LDRB LR,[R7, #+0]
\ 00000158 0E0050E1 CMP R0,LR
\ 0000015C 0100000A BEQ ??Mem_Cmp_14
454 mem_cmp = DEF_NO;
\ 00000160 0000A0E3 MOV R0,#+0
\ 00000164 00B0B0E1 MOVS R11,R0
455 }
456 size_rem -= sizeof(CPU_INT08U);
\ ??Mem_Cmp_14:
\ 00000168 01C05CE2 SUBS R12,R12,#+1
\ 0000016C F1FFFFEA B ??Mem_Cmp_6
457 }
458
459 return (mem_cmp);
\ ??Mem_Cmp_13:
\ 00000170 0B00B0E1 MOVS R0,R11
\ ??Mem_Cmp_1:
\ 00000174 04D08DE2 ADD SP,SP,#+4 ;; stack cleaning
\ 00000178 F08FBDE8 POP {R4-R11,PC} ;; return
460 }
461
Maximum stack usage in bytes:
Function CSTACK
-------- ------
Mem_Clr 12
Mem_Cmp 40
Mem_Copy 32
Mem_Set 20
Segment part sizes:
Function/Label Bytes
-------------- -----
Mem_Clr 32
Mem_Set 204
Mem_Copy 248
Mem_Cmp 380
864 bytes in segment CODE
864 bytes of CODE memory
Errors: none
Warnings: none
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -