📄 lib_mem.lst
字号:
337 *********************************************************************************************************
338 * Mem_Cmp()
339 *
340 * Description : Verify that ALL data octets in two memory buffers are identical in sequence.
341 *
342 * Argument(s) : p1_mem Pointer to first memory buffer.
343 *
344 * p2_mem Pointer to second memory buffer.
345 *
346 * size Number of data buffer octets to compare.
347 *
348 * Return(s) : DEF_YES, if 'size' number of data octets are identical in both memory buffers.
349 *
350 * DEF_NO, otherwise.
351 *
352 * Caller(s) : various.
353 *
354 * Note(s) : (1) Null compares allowed (i.e. 0-octet size); 'DEF_YES' returned to indicate identical
355 * null compare.
356 *
357 * (2) Many memory buffer comparisons vary ONLY in the least significant octets -- e.g.
358 * network address buffers. Consequently, memory buffer comparison is more efficient
359 * if the comparison starts from the end of the memory buffers which will abort sooner
360 * on dissimilar memory buffers that vary only in the least significant octets.
361 *
362 * (3) For best CPU performance, optimized to fill data buffer using 'CPU_ALIGN'-sized data words.
363 *
364 * (a) Since many word-aligned processors REQUIRE that multi-octet words be accessed on
365 * word-aligned addresses, 'CPU_ALIGN'd words MUST be accessed on 'CPU_ALIGN'd addresses.
366 *
367 * (4) Modulo arithmetic is used to determine whether a memory buffer starts on a 'CPU_ALIGN'
368 * address boundary.
369 *
370 * Modulo arithmetic in ANSI-C REQUIREs operations performed on integer values. Thus,
371 * address values MUST be cast to an appropriately-sized integer value PRIOR to any
372 * mem_align_modulo arithmetic operation.
373 ********************************************************************************************************
374 */
375 /*$PAGE*/
\ In segment CODE, align 4, keep-with-next
376 CPU_BOOLEAN Mem_Cmp (void *p1_mem,
377 void *p2_mem,
378 CPU_SIZE_T size)
379 {
\ Mem_Cmp:
\ 00000000 2DE9F041 PUSH {R4-R8,LR}
\ 00000004 0500 MOVS R5,R0
\ 00000006 0C00 MOVS R4,R1
380 CPU_SIZE_T size_rem;
381 CPU_ALIGN *p1_mem_align;
382 CPU_ALIGN *p2_mem_align;
383 CPU_INT08U *p1_mem_08;
384 CPU_INT08U *p2_mem_08;
385 CPU_INT08U i;
386 CPU_INT08U mem_align_modulo_1;
387 CPU_INT08U mem_align_modulo_2;
388 CPU_BOOLEAN mem_aligned;
389 CPU_BOOLEAN mem_cmp;
390
391
392 if (size < 1) { /* See Note #1. */
\ 00000008 002A CMP R2,#+0
\ 0000000A 01D1 BNE.N ??Mem_Cmp_0
393 return (DEF_YES);
\ 0000000C 0120 MOVS R0,#+1
\ 0000000E 4CE0 B.N ??Mem_Cmp_1
394 }
395 if (p1_mem == (void *)0) {
\ ??Mem_Cmp_0:
\ 00000010 002D CMP R5,#+0
\ 00000012 01D1 BNE.N ??Mem_Cmp_2
396 return (DEF_NO);
\ ??Mem_Cmp_3:
\ 00000014 0020 MOVS R0,#+0
\ 00000016 48E0 B.N ??Mem_Cmp_1
397 }
398 if (p2_mem == (void *)0) {
\ ??Mem_Cmp_2:
\ 00000018 002C CMP R4,#+0
\ 0000001A FBD0 BEQ.N ??Mem_Cmp_3
399 return (DEF_NO);
400 }
401
402
403 mem_cmp = DEF_YES;
\ 0000001C 0120 MOVS R0,#+1
\ 0000001E 8046 MOV R8,R0
404 size_rem = size;
\ 00000020 1300 MOVS R3,R2
405 /* Start @ end of mem bufs (see Note #2). */
406 p1_mem_08 = (CPU_INT08U *)p1_mem + size;
\ 00000022 A918 ADDS R1,R5,R2
407 p2_mem_08 = (CPU_INT08U *)p2_mem + size;
\ 00000024 A218 ADDS R2,R4,R2
408 /* See Note #4. */
409 mem_align_modulo_1 = (CPU_INT08U )((CPU_ADDR)p1_mem_08 % sizeof(CPU_ALIGN));
\ 00000026 0C00 MOVS R4,R1
\ 00000028 A507 LSLS R5,R4,#+30
\ 0000002A AD0F LSRS R5,R5,#+30
410 mem_align_modulo_2 = (CPU_INT08U )((CPU_ADDR)p2_mem_08 % sizeof(CPU_ALIGN));
411
412 mem_aligned = (mem_align_modulo_1 == mem_align_modulo_2) ? DEF_YES : DEF_NO;
\ 0000002C 0024 MOVS R4,#+0
\ 0000002E 2E00 MOVS R6,R5
\ 00000030 1700 MOVS R7,R2
\ 00000032 BF07 LSLS R7,R7,#+30
\ 00000034 BF0F LSRS R7,R7,#+30
\ 00000036 BE42 CMP R6,R7
\ 00000038 01D1 BNE.N ??Mem_Cmp_4
\ 0000003A 4646 MOV R6,R8
\ 0000003C 00E0 B.N ??Mem_Cmp_5
\ ??Mem_Cmp_4:
\ 0000003E 2600 MOVS R6,R4
413
414 if (mem_aligned == DEF_YES) { /* If mem bufs' alignment offset equal, ... */
\ ??Mem_Cmp_5:
\ 00000040 012E CMP R6,#+1
\ 00000042 2DD1 BNE.N ??Mem_Cmp_6
415 /* ... optimize cmp for mem buf alignment. */
416 if (mem_align_modulo_1 != 0) { /* If trailing octets avail, ... */
\ 00000044 2E00 MOVS R6,R5
\ 00000046 11D0 BEQ.N ??Mem_Cmp_7
417 i = mem_align_modulo_1;
\ 00000048 09E0 B.N ??Mem_Cmp_8
418 while ((mem_cmp == DEF_YES) && /* ... cmp mem bufs while identical & ... */
419 (size_rem > 0) && /* ... start mem buf cmp with trailing octets ... */
420 (i > 0)) { /* ... until next CPU_ALIGN word boundary. */
421 p1_mem_08--;
\ ??Mem_Cmp_9:
\ 0000004A 491E SUBS R1,R1,#+1
422 p2_mem_08--;
\ 0000004C 521E SUBS R2,R2,#+1
423 if (*p1_mem_08 != *p2_mem_08) { /* If ANY data octet(s) NOT identical, cmp fails. */
\ 0000004E 0E78 LDRB R6,[R1, #+0]
\ 00000050 1778 LDRB R7,[R2, #+0]
\ 00000052 BE42 CMP R6,R7
\ 00000054 00D0 BEQ.N ??Mem_Cmp_10
424 mem_cmp = DEF_NO;
\ 00000056 2000 MOVS R0,R4
425 }
426 size_rem -= sizeof(CPU_INT08U);
\ ??Mem_Cmp_10:
\ 00000058 5B1E SUBS R3,R3,#+1
427 i--;
\ 0000005A 6D1E SUBS R5,R5,#+1
\ 0000005C EDB2 UXTB R5,R5
428 }
\ ??Mem_Cmp_8:
\ 0000005E 0600 MOVS R6,R0
\ 00000060 012E CMP R6,#+1
\ 00000062 03D1 BNE.N ??Mem_Cmp_7
\ 00000064 002B CMP R3,#+0
\ 00000066 01D0 BEQ.N ??Mem_Cmp_7
\ 00000068 2E00 MOVS R6,R5
\ 0000006A EED1 BNE.N ??Mem_Cmp_9
429 }
430
431 if (mem_cmp == DEF_YES) { /* If cmp still identical, cmp aligned mem bufs. */
\ ??Mem_Cmp_7:
\ 0000006C 0500 MOVS R5,R0
\ 0000006E 012D CMP R5,#+1
\ 00000070 16D1 BNE.N ??Mem_Cmp_6
432 p1_mem_align = (CPU_ALIGN *)p1_mem_08; /* See Note #3a. */
433 p2_mem_align = (CPU_ALIGN *)p2_mem_08;
\ 00000072 07E0 B.N ??Mem_Cmp_11
434
435 while ((mem_cmp == DEF_YES) && /* Cmp mem bufs while identical & ... */
436 (size_rem >= sizeof(CPU_ALIGN))) { /* ... mem bufs aligned on CPU_ALIGN word boundaries. */
437 p1_mem_align--;
\ ??Mem_Cmp_12:
\ 00000074 091F SUBS R1,R1,#+4
438 p2_mem_align--;
\ 00000076 121F SUBS R2,R2,#+4
439 if (*p1_mem_align != *p2_mem_align) { /* If ANY data octet(s) NOT identical, cmp fails. */
\ 00000078 0D68 LDR R5,[R1, #+0]
\ 0000007A 1668 LDR R6,[R2, #+0]
\ 0000007C B542 CMP R5,R6
\ 0000007E 00D0 BEQ.N ??Mem_Cmp_13
440 mem_cmp = DEF_NO;
\ 00000080 2000 MOVS R0,R4
441 }
442 size_rem -= sizeof(CPU_ALIGN);
\ ??Mem_Cmp_13:
\ 00000082 1B1F SUBS R3,R3,#+4
443 }
\ ??Mem_Cmp_11:
\ 00000084 0500 MOVS R5,R0
\ 00000086 012D CMP R5,#+1
\ 00000088 0AD1 BNE.N ??Mem_Cmp_6
\ 0000008A 042B CMP R3,#+4
\ 0000008C F2D2 BCS.N ??Mem_Cmp_12
444
445 p1_mem_08 = (CPU_INT08U *)p1_mem_align;
446 p2_mem_08 = (CPU_INT08U *)p2_mem_align;
\ 0000008E 07E0 B.N ??Mem_Cmp_6
447 }
448 }
449
450 while ((mem_cmp == DEF_YES) && /* Cmp mem bufs while identical ... */
451 (size_rem > 0)) { /* ... for unaligned mem bufs or trailing octets. */
452 p1_mem_08--;
\ ??Mem_Cmp_14:
\ 00000090 491E SUBS R1,R1,#+1
453 p2_mem_08--;
\ 00000092 521E SUBS R2,R2,#+1
454 if (*p1_mem_08 != *p2_mem_08) { /* If ANY data octet(s) NOT identical, cmp fails. */
\ 00000094 0D78 LDRB R5,[R1, #+0]
\ 00000096 1678 LDRB R6,[R2, #+0]
\ 00000098 B542 CMP R5,R6
\ 0000009A 00D0 BEQ.N ??Mem_Cmp_15
455 mem_cmp = DEF_NO;
\ 0000009C 2000 MOVS R0,R4
456 }
457 size_rem -= sizeof(CPU_INT08U);
\ ??Mem_Cmp_15:
\ 0000009E 5B1E SUBS R3,R3,#+1
458 }
\ ??Mem_Cmp_6:
\ 000000A0 0500 MOVS R5,R0
\ 000000A2 012D CMP R5,#+1
\ 000000A4 01D1 BNE.N ??Mem_Cmp_1
\ 000000A6 002B CMP R3,#+0
\ 000000A8 F2D1 BNE.N ??Mem_Cmp_14
459
460 return (mem_cmp);
\ ??Mem_Cmp_1:
\ 000000AA BDE8F081 POP {R4-R8,PC} ;; return
461 }
462
Maximum stack usage in bytes:
Function CSTACK
-------- ------
Mem_Clr 4
Mem_Cmp 24
Mem_Copy 12
Mem_Set 12
Segment part sizes:
Function/Label Bytes
-------------- -----
Mem_Clr 12
Mem_Set 80
Mem_Copy 104
Mem_Cmp 174
370 bytes in segment CODE
370 bytes of CODE memory
Errors: none
Warnings: none
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -