📄 lib_mem.lst
字号:
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 + -