⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lib_mem.lst

📁 lpc2478开发板基于IAR编译器移植ucos实验例程
💻 LST
📖 第 1 页 / 共 3 页
字号:
    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 + -