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

📄 lib_mem.lst

📁 IARSOURCECODE是基于LPC2478嵌入式软件IAR EWARM V4.42的应用实例代码
💻 LST
📖 第 1 页 / 共 4 页
字号:
    272              CPU_ALIGN    *pmem_align_dest;
    273              CPU_ALIGN    *pmem_align_src;
    274              CPU_INT08U   *pmem_08_dest;
    275              CPU_INT08U   *pmem_08_src;
    276              CPU_INT08U    i;
    277              CPU_INT08U    mem_align_modulo_dest;
    278              CPU_INT08U    mem_align_modulo_src;
    279              CPU_BOOLEAN   mem_aligned;
    280          
    281          
    282              if (size < 1) {                                             /* See Note #1.                                         */
   \   00000004   000052E3           CMP      R2,#+0
   \   00000008   3800000A           BEQ      ??Mem_Copy_0
    283                  return;
    284              }
    285              if (pdest == (void *)0) {
   \   0000000C   000050E3           CMP      R0,#+0
   \   00000010   3600000A           BEQ      ??Mem_Copy_0
    286                  return;
    287              }
    288              if (psrc  == (void *)0) {
   \   00000014   000051E3           CMP      R1,#+0
   \   00000018   3400000A           BEQ      ??Mem_Copy_0
    289                  return;
    290              }
    291          
    292          
    293              size_rem              = (CPU_SIZE_T  )size;
   \   0000001C   0230B0E1           MOVS     R3,R2
    294          
    295              pmem_08_dest          = (CPU_INT08U *)pdest;
   \   00000020   0050B0E1           MOVS     R5,R0
    296              pmem_08_src           = (CPU_INT08U *)psrc;
   \   00000024   0160B0E1           MOVS     R6,R1
    297                                                                          /* See Note #4.                                         */
    298              mem_align_modulo_dest = (CPU_INT08U  )((CPU_ADDR)pmem_08_dest % sizeof(CPU_ALIGN));
   \   00000028   03B015E2           ANDS     R11,R5,#0x3      ;; Zero extend
   \   0000002C   0B80B0E1           MOVS     R8,R11
    299              mem_align_modulo_src  = (CPU_INT08U  )((CPU_ADDR)pmem_08_src  % sizeof(CPU_ALIGN));
   \   00000030   03B016E2           ANDS     R11,R6,#0x3      ;; Zero extend
   \   00000034   0B90B0E1           MOVS     R9,R11
    300          
    301              mem_aligned           = (mem_align_modulo_dest == mem_align_modulo_src) ? DEF_YES : DEF_NO;
   \   00000038   FF8018E2           ANDS     R8,R8,#0xFF      ;; Zero extend
   \   0000003C   FF9019E2           ANDS     R9,R9,#0xFF      ;; Zero extend
   \   00000040   090058E1           CMP      R8,R9
   \   00000044   0100001A           BNE      ??Mem_Copy_1
   \   00000048   01A0A0E3           MOV      R10,#+1
   \   0000004C   000000EA           B        ??Mem_Copy_2
   \                     ??Mem_Copy_1:
   \   00000050   00A0A0E3           MOV      R10,#+0
    302          
    303              if (mem_aligned == DEF_YES) {                               /* If mem bufs' alignment offset equal, ...             */
   \                     ??Mem_Copy_2:
   \   00000054   FFA01AE2           ANDS     R10,R10,#0xFF    ;; Zero extend
   \   00000058   01005AE3           CMP      R10,#+1
   \   0000005C   1B00001A           BNE      ??Mem_Copy_3
    304                                                                          /* ... optimize copy for mem buf alignment.             */
    305                  if (mem_align_modulo_dest != 0) {                       /* If leading octets avail,                   ...       */
   \   00000060   FF8018E2           ANDS     R8,R8,#0xFF      ;; Zero extend
   \   00000064   000058E3           CMP      R8,#+0
   \   00000068   0C00000A           BEQ      ??Mem_Copy_4
    306                      i = mem_align_modulo_dest;
   \   0000006C   0870B0E1           MOVS     R7,R8
    307                      while ((size_rem   >  0) &&                         /* ... start mem buf copy with leading octets ...       */
    308                             (i          <  sizeof(CPU_ALIGN ))) {        /* ... until next CPU_ALIGN word boundary.              */
   \                     ??Mem_Copy_5:
   \   00000070   000053E3           CMP      R3,#+0
   \   00000074   0900000A           BEQ      ??Mem_Copy_4
   \   00000078   FF7017E2           ANDS     R7,R7,#0xFF      ;; Zero extend
   \   0000007C   040057E3           CMP      R7,#+4
   \   00000080   0600002A           BCS      ??Mem_Copy_4
    309                         *pmem_08_dest++ = *pmem_08_src++;
   \   00000084   00B0D6E5           LDRB     R11,[R6, #+0]
   \   00000088   00B0C5E5           STRB     R11,[R5, #+0]
   \   0000008C   016096E2           ADDS     R6,R6,#+1
   \   00000090   015095E2           ADDS     R5,R5,#+1
    310                          size_rem      -=  sizeof(CPU_INT08U);
   \   00000094   013053E2           SUBS     R3,R3,#+1
    311                          i++;
   \   00000098   017097E2           ADDS     R7,R7,#+1
   \   0000009C   F3FFFFEA           B        ??Mem_Copy_5
    312                      }
    313                  }
    314          
    315                  pmem_align_dest = (CPU_ALIGN *)pmem_08_dest;            /* See Note #3a.                                        */
   \                     ??Mem_Copy_4:
   \   000000A0   05C0B0E1           MOVS     R12,R5
    316                  pmem_align_src  = (CPU_ALIGN *)pmem_08_src;
   \   000000A4   0640B0E1           MOVS     R4,R6
    317                  while (size_rem      >=  sizeof(CPU_ALIGN)) {           /* While mem bufs aligned on CPU_ALIGN word boundaries, */
   \                     ??Mem_Copy_6:
   \   000000A8   040053E3           CMP      R3,#+4
   \   000000AC   0500003A           BCC      ??Mem_Copy_7
    318                     *pmem_align_dest++ = *pmem_align_src++;              /* ... copy psrc to pdest with CPU_ALIGN-sized words.   */
   \   000000B0   00B094E5           LDR      R11,[R4, #+0]
   \   000000B4   00B08CE5           STR      R11,[R12, #+0]
   \   000000B8   044094E2           ADDS     R4,R4,#+4
   \   000000BC   04C09CE2           ADDS     R12,R12,#+4
    319                      size_rem         -=  sizeof(CPU_ALIGN);
   \   000000C0   043053E2           SUBS     R3,R3,#+4
   \   000000C4   F7FFFFEA           B        ??Mem_Copy_6
    320                  }
    321          
    322                  pmem_08_dest = (CPU_INT08U *)pmem_align_dest;
   \                     ??Mem_Copy_7:
   \   000000C8   0C50B0E1           MOVS     R5,R12
    323                  pmem_08_src  = (CPU_INT08U *)pmem_align_src;
   \   000000CC   0460B0E1           MOVS     R6,R4
    324              }
    325          
    326              while (size_rem > 0) {                                      /* For unaligned mem bufs or trailing octets, ...       */
   \                     ??Mem_Copy_3:
   \   000000D0   000053E3           CMP      R3,#+0
   \   000000D4   0500000A           BEQ      ??Mem_Copy_0
    327                 *pmem_08_dest++ = *pmem_08_src++;                        /* ... copy psrc to pdest by octets.                    */
   \   000000D8   00B0D6E5           LDRB     R11,[R6, #+0]
   \   000000DC   00B0C5E5           STRB     R11,[R5, #+0]
   \   000000E0   016096E2           ADDS     R6,R6,#+1
   \   000000E4   015095E2           ADDS     R5,R5,#+1
    328                  size_rem      -=  sizeof(CPU_INT08U);
   \   000000E8   013053E2           SUBS     R3,R3,#+1
   \   000000EC   F7FFFFEA           B        ??Mem_Copy_3
    329              }
   \                     ??Mem_Copy_0:
   \   000000F0   F00FBDE8           POP      {R4-R11}
   \   000000F4   0EF0A0E1           MOV      PC,LR            ;; return
    330          }
    331          #endif
    332          
    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   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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -