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

📄 lib_mem.lst

📁 IARSOURCECODE是基于LPC2478嵌入式软件IAR EWARM V4.42的应用实例代码
💻 LST
📖 第 1 页 / 共 3 页
字号:
    188                  return;
    189              }
    190              if (pmem == (void *)0) {
   \   0000000C   000050E3           CMP      R0,#+0
   \   00000010   2300000A           BEQ      ??Mem_Set_0
    191                  return;
    192              }
    193          
    194          
    195              data_align = 0;
   \   00000014   0030A0E3           MOV      R3,#+0
    196              for (i = 0; i < sizeof(CPU_ALIGN); i++) {                   /* Fill each data_align octet with data val.            */
   \   00000018   00C0A0E3           MOV      R12,#+0
   \   0000001C   030000EA           B        ??Mem_Set_1
    197                  data_align <<=  DEF_OCTET_NBR_BITS;
   \                     ??Mem_Set_2:
   \   00000020   0334B0E1           LSLS     R3,R3,#+8
    198                  data_align  |= (CPU_ALIGN)data_val;
   \   00000024   0140B0E1           MOVS     R4,R1
   \   00000028   033094E1           ORRS     R3,R4,R3
    199              }
   \   0000002C   01C09CE2           ADDS     R12,R12,#+1
   \                     ??Mem_Set_1:
   \   00000030   FFC01CE2           ANDS     R12,R12,#0xFF    ;; Zero extend
   \   00000034   04005CE3           CMP      R12,#+4
   \   00000038   F8FFFF3A           BCC      ??Mem_Set_2
    200          
    201              size_rem         = (CPU_SIZE_T)size;
    202              mem_align_modulo = (CPU_INT08U)((CPU_ADDR)pmem % sizeof(CPU_ALIGN));    /* See Note #3.                             */
   \   0000003C   03C010E2           ANDS     R12,R0,#0x3      ;; Zero extend
    203          
    204              pmem_08 = (CPU_INT08U *)pmem;
    205              if (mem_align_modulo != 0) {                                /* If leading octets avail,                   ...       */
   \   00000040   FFC01CE2           ANDS     R12,R12,#0xFF    ;; Zero extend
   \   00000044   00005CE3           CMP      R12,#+0
   \   00000048   0900000A           BEQ      ??Mem_Set_3
    206                  i = mem_align_modulo;
   \   0000004C   030000EA           B        ??Mem_Set_4
    207                  while ((size_rem > 0) &&                                /* ... start mem buf fill with leading octets ...       */
    208                         (i        < sizeof(CPU_ALIGN ))) {               /* ... until next CPU_ALIGN word boundary.              */
    209                     *pmem_08++ = data_val;
   \                     ??Mem_Set_5:
   \   00000050   0010C0E5           STRB     R1,[R0, #+0]
   \   00000054   010090E2           ADDS     R0,R0,#+1
    210                      size_rem -= sizeof(CPU_INT08U);
   \   00000058   012052E2           SUBS     R2,R2,#+1
    211                      i++;
   \   0000005C   01C09CE2           ADDS     R12,R12,#+1
    212                  }
   \                     ??Mem_Set_4:
   \   00000060   000052E3           CMP      R2,#+0
   \   00000064   0200000A           BEQ      ??Mem_Set_3
   \   00000068   FFC01CE2           ANDS     R12,R12,#0xFF    ;; Zero extend
   \   0000006C   04005CE3           CMP      R12,#+4
   \   00000070   F6FFFF3A           BCC      ??Mem_Set_5
    213              }
    214          
    215              pmem_align = (CPU_ALIGN *)pmem_08;                          /* See Note #2a.                                        */
   \                     ??Mem_Set_3:
   \   00000074   020000EA           B        ??Mem_Set_6
    216              while (size_rem >= sizeof(CPU_ALIGN)) {                     /* While mem buf aligned on CPU_ALIGN word boundaries,  */
    217                 *pmem_align++ = data_align;                              /* ... fill mem buf with    CPU_ALIGN-sized data.       */
   \                     ??Mem_Set_7:
   \   00000078   003080E5           STR      R3,[R0, #+0]
   \   0000007C   040090E2           ADDS     R0,R0,#+4
    218                  size_rem    -= sizeof(CPU_ALIGN);
   \   00000080   042052E2           SUBS     R2,R2,#+4
    219              }
   \                     ??Mem_Set_6:
   \   00000084   040052E3           CMP      R2,#+4
   \   00000088   FAFFFF2A           BCS      ??Mem_Set_7
    220          
    221              pmem_08 = (CPU_INT08U *)pmem_align;
   \   0000008C   020000EA           B        ??Mem_Set_8
    222              while (size_rem > 0) {                                      /* Finish mem buf fill with trailing octets.            */
    223                 *pmem_08++   = data_val;
   \                     ??Mem_Set_9:
   \   00000090   0010C0E5           STRB     R1,[R0, #+0]
   \   00000094   010090E2           ADDS     R0,R0,#+1
    224                  size_rem   -= sizeof(CPU_INT08U);
   \   00000098   012052E2           SUBS     R2,R2,#+1
    225              }
   \                     ??Mem_Set_8:
   \   0000009C   000052E3           CMP      R2,#+0
   \   000000A0   FAFFFF1A           BNE      ??Mem_Set_9
   \                     ??Mem_Set_0:
   \   000000A4   1000BDE8           POP      {R4}
   \   000000A8   0EF0A0E1           MOV      PC,LR            ;; return
    226          }
    227          
    228          
    229          /*$PAGE*/
    230          /*
    231          *********************************************************************************************************
    232          *                                             Mem_Copy()
    233          *
    234          * Description : Copy data octets from one buffer to another buffer.
    235          *
    236          * Argument(s) : pdest       Pointer to destination memory buffer.
    237          *
    238          *               psrc        Pointer to source      memory buffer.
    239          *
    240          *               size        Number of data buffer octets to copy.
    241          *
    242          * Return(s)   : none.
    243          *
    244          * Caller(s)   : various.
    245          *
    246          * Note(s)     : (1) Null copies allowed (i.e. 0-octet size).
    247          *
    248          *               (2) Memory buffers NOT checked for overlapping.
    249          *
    250          *               (3) For best CPU performance, optimized to fill data buffer using 'CPU_ALIGN'-sized data words.
    251          *
    252          *                   (a) Since many word-aligned processors REQUIRE that multi-octet words be accessed on 
    253          *                       word-aligned addresses, 'CPU_ALIGN'd words MUST be accessed on 'CPU_ALIGN'd addresses.
    254          *
    255          *               (4) Modulo arithmetic is used to determine whether a memory buffer starts on a 'CPU_ALIGN'
    256          *                   address boundary.
    257          *
    258          *                   Modulo arithmetic in ANSI-C REQUIREs operations performed on integer values.  Thus, 
    259          *                   address values MUST be cast to an appropriately-sized integer value PRIOR to any
    260          *                   mem_align_modulo arithmetic operation.
    261          *********************************************************************************************************
    262          */
    263          /*$PAGE*/
    264          #if ((!defined(uC_CFG_OPTIMIZE_ASM_EN)) || \
    265               ((defined(uC_CFG_OPTIMIZE_ASM_EN)) && \
    266                        (uC_CFG_OPTIMIZE_ASM_EN   != DEF_ENABLED)))

   \                                 In segment CODE, align 4, keep-with-next
    267          void  Mem_Copy (void        *pdest,
    268                          void        *psrc,
    269                          CPU_SIZE_T   size)
    270          {
    271              CPU_SIZE_T    size_rem;
    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.                                         */
   \                     Mem_Copy:
   \   00000000   000052E3           CMP      R2,#+0
   \   00000004   2E00000A           BEQ      ??Mem_Copy_0
    283                  return;
    284              }
    285              if (pdest == (void *)0) {
   \   00000008   000050E3           CMP      R0,#+0
   \   0000000C   2C00000A           BEQ      ??Mem_Copy_0
    286                  return;
    287              }
    288              if (psrc  == (void *)0) {
   \   00000010   000051E3           CMP      R1,#+0
   \   00000014   2A00000A           BEQ      ??Mem_Copy_0
    289                  return;
    290              }
    291          
    292          
    293              size_rem              = (CPU_SIZE_T  )size;
    294          
    295              pmem_08_dest          = (CPU_INT08U *)pdest;
    296              pmem_08_src           = (CPU_INT08U *)psrc;
    297                                                                          /* See Note #4.                                         */
    298              mem_align_modulo_dest = (CPU_INT08U  )((CPU_ADDR)pmem_08_dest % sizeof(CPU_ALIGN));
   \   00000018   033010E2           ANDS     R3,R0,#0x3       ;; Zero extend
    299              mem_align_modulo_src  = (CPU_INT08U  )((CPU_ADDR)pmem_08_src  % sizeof(CPU_ALIGN));
   \   0000001C   03C011E2           ANDS     R12,R1,#0x3      ;; Zero extend
    300          
    301              mem_aligned           = (mem_align_modulo_dest == mem_align_modulo_src) ? DEF_YES : DEF_NO;
   \   00000020   FF3013E2           ANDS     R3,R3,#0xFF      ;; Zero extend
   \   00000024   FFC01CE2           ANDS     R12,R12,#0xFF    ;; Zero extend
   \   00000028   0C0053E1           CMP      R3,R12
   \   0000002C   0100001A           BNE      ??Mem_Copy_1
   \   00000030   01C0A0E3           MOV      R12,#+1
   \   00000034   000000EA           B        ??Mem_Copy_2
   \                     ??Mem_Copy_1:
   \   00000038   00C0A0E3           MOV      R12,#+0
    302          
    303              if (mem_aligned == DEF_YES) {                               /* If mem bufs' alignment offset equal, ...             */
   \                     ??Mem_Copy_2:
   \   0000003C   FFC01CE2           ANDS     R12,R12,#0xFF    ;; Zero extend
   \   00000040   01005CE3           CMP      R12,#+1
   \   00000044   1C00001A           BNE      ??Mem_Copy_3
    304                                                                          /* ... optimize copy for mem buf alignment.             */
    305                  if (mem_align_modulo_dest != 0) {                       /* If leading octets avail,                   ...       */
   \   00000048   FF3013E2           ANDS     R3,R3,#0xFF      ;; Zero extend
   \   0000004C   000053E3           CMP      R3,#+0
   \   00000050   0B00000A           BEQ      ??Mem_Copy_4
    306                      i = mem_align_modulo_dest;
   \   00000054   050000EA           B        ??Mem_Copy_5
    307                      while ((size_rem   >  0) &&                         /* ... start mem buf copy with leading octets ...       */
    308                             (i          <  sizeof(CPU_ALIGN ))) {        /* ... until next CPU_ALIGN word boundary.              */
    309                         *pmem_08_dest++ = *pmem_08_src++;
   \                     ??Mem_Copy_6:
   \   00000058   00C0D1E5           LDRB     R12,[R1, #+0]
   \   0000005C   00C0C0E5           STRB     R12,[R0, #+0]
   \   00000060   011091E2           ADDS     R1,R1,#+1
   \   00000064   010090E2           ADDS     R0,R0,#+1
    310                          size_rem      -=  sizeof(CPU_INT08U);
   \   00000068   012052E2           SUBS     R2,R2,#+1
    311                          i++;
   \   0000006C   013093E2           ADDS     R3,R3,#+1
    312                      }
   \                     ??Mem_Copy_5:
   \   00000070   000052E3           CMP      R2,#+0
   \   00000074   0200000A           BEQ      ??Mem_Copy_4
   \   00000078   FF3013E2           ANDS     R3,R3,#0xFF      ;; Zero extend
   \   0000007C   040053E3           CMP      R3,#+4
   \   00000080   F4FFFF3A           BCC      ??Mem_Copy_6
    313                  }
    314          
    315                  pmem_align_dest = (CPU_ALIGN *)pmem_08_dest;            /* See Note #3a.                                        */
    316                  pmem_align_src  = (CPU_ALIGN *)pmem_08_src;
   \                     ??Mem_Copy_4:
   \   00000084   040000EA           B        ??Mem_Copy_7
    317                  while (size_rem      >=  sizeof(CPU_ALIGN)) {           /* While mem bufs aligned on CPU_ALIGN word boundaries, */
    318                     *pmem_align_dest++ = *pmem_align_src++;              /* ... copy psrc to pdest with CPU_ALIGN-sized words.   */
   \                     ??Mem_Copy_8:
   \   00000088   003091E5           LDR      R3,[R1, #+0]
   \   0000008C   003080E5           STR      R3,[R0, #+0]
   \   00000090   041091E2           ADDS     R1,R1,#+4
   \   00000094   040090E2           ADDS     R0,R0,#+4
    319                      size_rem         -=  sizeof(CPU_ALIGN);
   \   00000098   042052E2           SUBS     R2,R2,#+4
    320                  }
   \                     ??Mem_Copy_7:
   \   0000009C   040052E3           CMP      R2,#+4
   \   000000A0   F8FFFF2A           BCS      ??Mem_Copy_8
    321          
    322                  pmem_08_dest = (CPU_INT08U *)pmem_align_dest;
    323                  pmem_08_src  = (CPU_INT08U *)pmem_align_src;
   \   000000A4   040000EA           B        ??Mem_Copy_3
    324              }
    325          
    326              while (size_rem > 0) {                                      /* For unaligned mem bufs or trailing octets, ...       */
    327                 *pmem_08_dest++ = *pmem_08_src++;                        /* ... copy psrc to pdest by octets.                    */
   \                     ??Mem_Copy_9:
   \   000000A8   0030D1E5           LDRB     R3,[R1, #+0]
   \   000000AC   0030C0E5           STRB     R3,[R0, #+0]
   \   000000B0   011091E2           ADDS     R1,R1,#+1
   \   000000B4   010090E2           ADDS     R0,R0,#+1
    328                  size_rem      -=  sizeof(CPU_INT08U);
   \   000000B8   012052E2           SUBS     R2,R2,#+1
    329              }
   \                     ??Mem_Copy_3:
   \   000000BC   000052E3           CMP      R2,#+0
   \   000000C0   F8FFFF1A           BNE      ??Mem_Copy_9
   \                     ??Mem_Copy_0:
   \   000000C4   0EF0A0E1           MOV      PC,LR            ;; return
    330          }
    331          #endif
    332          

⌨️ 快捷键说明

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