📄 lib_mem.lst
字号:
333
334 /*$PAGE*/
335 /*
336 *********************************************************************************************************
337 * Mem_Cmp()
338 *
339 * Description : Verify that ALL data octets in two memory buffers are identical in sequence.
340 *
341 * Argument(s) : p1_mem Pointer to first memory buffer.
342 *
343 * p2_mem Pointer to second memory buffer.
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 30002DE9 PUSH {R4,R5}
\ 00000004 0230B0E1 MOVS R3,R2
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. */
\ 00000008 000053E3 CMP R3,#+0
\ 0000000C 0100001A BNE ??Mem_Cmp_0
392 return (DEF_YES);
\ 00000010 0100A0E3 MOV R0,#+1
\ 00000014 470000EA B ??Mem_Cmp_1
393 }
394 if (p1_mem == (void *)0) {
\ ??Mem_Cmp_0:
\ 00000018 000050E3 CMP R0,#+0
\ 0000001C 0100001A BNE ??Mem_Cmp_2
395 return (DEF_NO);
\ 00000020 0000A0E3 MOV R0,#+0
\ 00000024 430000EA B ??Mem_Cmp_1
396 }
397 if (p2_mem == (void *)0) {
\ ??Mem_Cmp_2:
\ 00000028 000051E3 CMP R1,#+0
\ 0000002C 0100001A BNE ??Mem_Cmp_3
398 return (DEF_NO);
\ 00000030 0000A0E3 MOV R0,#+0
\ 00000034 3F0000EA B ??Mem_Cmp_1
399 }
400
401
402 mem_cmp = DEF_YES;
\ ??Mem_Cmp_3:
\ 00000038 0120A0E3 MOV R2,#+1
403 size_rem = size;
404 /* Start @ end of mem bufs (see Note #2). */
405 p1_mem_08 = (CPU_INT08U *)p1_mem + size;
\ 0000003C 000093E0 ADDS R0,R3,R0
406 p2_mem_08 = (CPU_INT08U *)p2_mem + size;
\ 00000040 011093E0 ADDS R1,R3,R1
407 /* See Note #4. */
408 mem_align_modulo_1 = (CPU_INT08U )((CPU_ADDR)p1_mem_08 % sizeof(CPU_ALIGN));
\ 00000044 03C010E2 ANDS R12,R0,#0x3 ;; Zero extend
409 mem_align_modulo_2 = (CPU_INT08U )((CPU_ADDR)p2_mem_08 % sizeof(CPU_ALIGN));
\ 00000048 034011E2 ANDS R4,R1,#0x3 ;; Zero extend
410
411 mem_aligned = (mem_align_modulo_1 == mem_align_modulo_2) ? DEF_YES : DEF_NO;
\ 0000004C FFC01CE2 ANDS R12,R12,#0xFF ;; Zero extend
\ 00000050 FF4014E2 ANDS R4,R4,#0xFF ;; Zero extend
\ 00000054 04005CE1 CMP R12,R4
\ 00000058 0100001A BNE ??Mem_Cmp_4
\ 0000005C 0140A0E3 MOV R4,#+1
\ 00000060 000000EA B ??Mem_Cmp_5
\ ??Mem_Cmp_4:
\ 00000064 0040A0E3 MOV R4,#+0
412
413 if (mem_aligned == DEF_YES) { /* If mem bufs' alignment offset equal, ... */
\ ??Mem_Cmp_5:
\ 00000068 FF4014E2 ANDS R4,R4,#0xFF ;; Zero extend
\ 0000006C 010054E3 CMP R4,#+1
\ 00000070 2B00001A BNE ??Mem_Cmp_6
414 /* ... optimize cmp for mem buf alignment. */
415 if (mem_align_modulo_1 != 0) { /* If trailing octets avail, ... */
\ 00000074 FFC01CE2 ANDS R12,R12,#0xFF ;; Zero extend
\ 00000078 00005CE3 CMP R12,#+0
\ 0000007C 1000000A BEQ ??Mem_Cmp_7
416 i = mem_align_modulo_1;
\ 00000080 080000EA B ??Mem_Cmp_8
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. */
420 p1_mem_08--;
\ ??Mem_Cmp_9:
\ 00000084 010050E2 SUBS R0,R0,#+1
421 p2_mem_08--;
\ 00000088 011051E2 SUBS R1,R1,#+1
422 if (*p1_mem_08 != *p2_mem_08) { /* If ANY data octet(s) NOT identical, cmp fails. */
\ 0000008C 0040D0E5 LDRB R4,[R0, #+0]
\ 00000090 0050D1E5 LDRB R5,[R1, #+0]
\ 00000094 050054E1 CMP R4,R5
\ 00000098 0000000A BEQ ??Mem_Cmp_10
423 mem_cmp = DEF_NO;
\ 0000009C 0020A0E3 MOV R2,#+0
424 }
425 size_rem -= sizeof(CPU_INT08U);
\ ??Mem_Cmp_10:
\ 000000A0 013053E2 SUBS R3,R3,#+1
426 i--;
\ 000000A4 01C05CE2 SUBS R12,R12,#+1
427 }
\ ??Mem_Cmp_8:
\ 000000A8 010052E3 CMP R2,#+1
\ 000000AC 0400001A BNE ??Mem_Cmp_7
\ 000000B0 000053E3 CMP R3,#+0
\ 000000B4 0200000A BEQ ??Mem_Cmp_7
\ 000000B8 FFC01CE2 ANDS R12,R12,#0xFF ;; Zero extend
\ 000000BC 01005CE3 CMP R12,#+1
\ 000000C0 EFFFFF2A BCS ??Mem_Cmp_9
428 }
429
430 if (mem_cmp == DEF_YES) { /* If cmp still identical, cmp aligned mem bufs. */
\ ??Mem_Cmp_7:
\ 000000C4 010052E3 CMP R2,#+1
\ 000000C8 1500001A BNE ??Mem_Cmp_6
431 p1_mem_align = (CPU_ALIGN *)p1_mem_08; /* See Note #3a. */
432 p2_mem_align = (CPU_ALIGN *)p2_mem_08;
\ 000000CC 070000EA B ??Mem_Cmp_11
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. */
436 p1_mem_align--;
\ ??Mem_Cmp_12:
\ 000000D0 040050E2 SUBS R0,R0,#+4
437 p2_mem_align--;
\ 000000D4 041051E2 SUBS R1,R1,#+4
438 if (*p1_mem_align != *p2_mem_align) { /* If ANY data octet(s) NOT identical, cmp fails. */
\ 000000D8 004090E5 LDR R4,[R0, #+0]
\ 000000DC 005091E5 LDR R5,[R1, #+0]
\ 000000E0 050054E1 CMP R4,R5
\ 000000E4 0000000A BEQ ??Mem_Cmp_13
439 mem_cmp = DEF_NO;
\ 000000E8 0020A0E3 MOV R2,#+0
440 }
441 size_rem -= sizeof(CPU_ALIGN);
\ ??Mem_Cmp_13:
\ 000000EC 043053E2 SUBS R3,R3,#+4
442 }
\ ??Mem_Cmp_11:
\ 000000F0 010052E3 CMP R2,#+1
\ 000000F4 0100001A BNE ??Mem_Cmp_14
\ 000000F8 040053E3 CMP R3,#+4
\ 000000FC F3FFFF2A BCS ??Mem_Cmp_12
443
444 p1_mem_08 = (CPU_INT08U *)p1_mem_align;
445 p2_mem_08 = (CPU_INT08U *)p2_mem_align;
\ ??Mem_Cmp_14:
\ 00000100 070000EA B ??Mem_Cmp_6
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. */
451 p1_mem_08--;
\ ??Mem_Cmp_15:
\ 00000104 010050E2 SUBS R0,R0,#+1
452 p2_mem_08--;
\ 00000108 011051E2 SUBS R1,R1,#+1
453 if (*p1_mem_08 != *p2_mem_08) { /* If ANY data octet(s) NOT identical, cmp fails. */
\ 0000010C 0040D0E5 LDRB R4,[R0, #+0]
\ 00000110 0050D1E5 LDRB R5,[R1, #+0]
\ 00000114 050054E1 CMP R4,R5
\ 00000118 0000000A BEQ ??Mem_Cmp_16
454 mem_cmp = DEF_NO;
\ 0000011C 0020A0E3 MOV R2,#+0
455 }
456 size_rem -= sizeof(CPU_INT08U);
\ ??Mem_Cmp_16:
\ 00000120 013053E2 SUBS R3,R3,#+1
457 }
\ ??Mem_Cmp_6:
\ 00000124 010052E3 CMP R2,#+1
\ 00000128 0100001A BNE ??Mem_Cmp_17
\ 0000012C 000053E3 CMP R3,#+0
\ 00000130 F3FFFF1A BNE ??Mem_Cmp_15
458
459 return (mem_cmp);
\ ??Mem_Cmp_17:
\ 00000134 0200B0E1 MOVS R0,R2
\ ??Mem_Cmp_1:
\ 00000138 3000BDE8 POP {R4,R5}
\ 0000013C 0EF0A0E1 MOV PC,LR ;; return
460 }
461
Maximum stack usage in bytes:
Function CSTACK
-------- ------
Mem_Clr 4
Mem_Cmp 8
Mem_Copy 0
Mem_Set 4
Segment part sizes:
Function/Label Bytes
-------------- -----
Mem_Clr 20
Mem_Set 172
Mem_Copy 200
Mem_Cmp 320
712 bytes in segment CODE
712 bytes of CODE memory
Errors: none
Warnings: none
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -