📄 guialloc.txt
字号:
|L9.68|
000044 f9363030 LDRSH r3,[r6,r0,LSL #3]
000048 f9b22002 LDRSH r2,[r2,#2]
00004c f9367031 LDRSH r7,[r6,r1,LSL #3]
000050 441a ADD r2,r2,r3
000052 1aba SUBS r2,r7,r2
000054 42a2 CMP r2,r4
000056 da10 BGE |L9.122|
000058 4608 MOV r0,r1
|L9.90|
00005a eb0602c0 ADD r2,r6,r0,LSL #3
00005e 8891 LDRH r1,[r2,#4]
000060 2900 CMP r1,#0
000062 d1ef BNE |L9.68|
000064 eb0602c0 ADD r2,r6,r0,LSL #3
000068 f9361030 LDRSH r1,[r6,r0,LSL #3]
00006c f9b22002 LDRSH r2,[r2,#2]
000070 4411 ADD r1,r1,r2
000072 f5c15120 RSB r1,r1,#0x2800
000076 42a1 CMP r1,r4
000078 db01 BLT |L9.126|
|L9.122|
00007a b200 SXTH r0,r0
00007c e001 B |L9.130|
|L9.126|
00007e f04f30ff MOV r0,#0xffffffff
|L9.130|
;;;276 return 0;
;;;277 /* Locate or Create hole of sufficient size */
;;;278 hMemIns = _FindHole(size);
;;;279 #if GUI_ALLOC_AUTDEFRAG
;;;280 if (hMemIns == -1) {
000082 1c41 ADDS r1,r0,#1
000084 d107 BNE |L9.150|
;;;281 hMemIns = _CreateHole(size);
000086 4620 MOV r0,r4
000088 f7fffffe BL _CreateHole
;;;282 }
;;;283 #endif
;;;284 /* Occupy hole */
;;;285 if (hMemIns==-1) {
00008c 1c41 ADDS r1,r0,#1
00008e d102 BNE |L9.150|
|L9.144|
;;;286 GUI_DEBUG_ERROROUT1("GUI_ALLOC_Alloc: Could not allocate %d bytes",size);
;;;287 return 0;
000090 2000 MOVS r0,#0
|L9.146|
;;;288 }
;;;289 {
;;;290 GUI_ALLOC_DATATYPE Off = aBlock[hMemIns].Off + aBlock[hMemIns].Size;
;;;291 int Next = aBlock[hMemIns].Next;
;;;292 aBlock[hMemNew].Size = size;
;;;293 aBlock[hMemNew].Off = Off;
;;;294 if ((aBlock[hMemNew].Next = Next) >0) {
;;;295 aBlock[Next].Prev = hMemNew;
;;;296 }
;;;297 aBlock[hMemNew].Prev = hMemIns;
;;;298 aBlock[hMemIns].Next = hMemNew;
;;;299 }
;;;300 /* Keep track of number of blocks and av. memory */
;;;301 GUI_ALLOC.NumUsedBlocks++;
;;;302 GUI_ALLOC.NumFreeBlocks--;
;;;303 if (GUI_ALLOC.NumFreeBlocksMin > GUI_ALLOC.NumFreeBlocks) {
;;;304 GUI_ALLOC.NumFreeBlocksMin = GUI_ALLOC.NumFreeBlocks;
;;;305 }
;;;306 GUI_ALLOC.NumUsedBytes += size;
;;;307 GUI_ALLOC.NumFreeBytes -= size;
;;;308 if (GUI_ALLOC.NumFreeBytesMin > GUI_ALLOC.NumFreeBytes) {
;;;309 GUI_ALLOC.NumFreeBytesMin = GUI_ALLOC.NumFreeBytes;
;;;310 }
;;;311 return hMemNew;
;;;312 }
000092 e8bd81f0 POP {r4-r8,pc}
|L9.150|
000096 eb0607c0 ADD r7,r6,r0,LSL #3 ;290
00009a f8361030 LDRH r1,[r6,r0,LSL #3] ;290
00009e 887b LDRH r3,[r7,#2] ;290
0000a0 88ba LDRH r2,[r7,#4] ;291
0000a2 440b ADD r3,r3,r1 ;290
0000a4 eb0601c5 ADD r1,r6,r5,LSL #3 ;292
0000a8 804c STRH r4,[r1,#2] ;292
0000aa f8263035 STRH r3,[r6,r5,LSL #3] ;293
0000ae 808a STRH r2,[r1,#4] ;294
0000b0 b112 CBZ r2,|L9.184|
0000b2 eb0602c2 ADD r2,r6,r2,LSL #3 ;295
0000b6 80d5 STRH r5,[r2,#6] ;295
|L9.184|
0000b8 80c8 STRH r0,[r1,#6] ;297
0000ba 80bd STRH r5,[r7,#4] ;298
0000bc f8d80000 LDR r0,[r8,#0] ;301 ; GUI_ALLOC
0000c0 4641 MOV r1,r8 ;301
0000c2 1c40 ADDS r0,r0,#1 ;301
0000c4 f8c80000 STR r0,[r8,#0] ;302 ; GUI_ALLOC
0000c8 f8d80004 LDR r0,[r8,#4] ;302 ; GUI_ALLOC
0000cc 1e40 SUBS r0,r0,#1 ;302
0000ce f8c80004 STR r0,[r8,#4] ;303 ; GUI_ALLOC
0000d2 f8d82008 LDR r2,[r8,#8] ;303 ; GUI_ALLOC
0000d6 4282 CMP r2,r0 ;303
0000d8 dd00 BLE |L9.220|
0000da 6088 STR r0,[r1,#8] ;304 ; GUI_ALLOC
|L9.220|
0000dc 8988 LDRH r0,[r1,#0xc] ;306 ; GUI_ALLOC
0000de 4420 ADD r0,r0,r4 ;306
0000e0 8188 STRH r0,[r1,#0xc] ;306
0000e2 89c8 LDRH r0,[r1,#0xe] ;307 ; GUI_ALLOC
0000e4 1b00 SUBS r0,r0,r4 ;307
0000e6 b200 SXTH r0,r0 ;307
0000e8 81c8 STRH r0,[r1,#0xe] ;307
0000ea f9b12010 LDRSH r2,[r1,#0x10] ;308 ; GUI_ALLOC
0000ee 4282 CMP r2,r0 ;308
0000f0 dd00 BLE |L9.244|
0000f2 8208 STRH r0,[r1,#0x10] ;309
|L9.244|
0000f4 4628 MOV r0,r5 ;311
0000f6 e7cc B |L9.146|
;;;313
ENDP
|L9.248|
DCD ||.bss||+0x3210
AREA ||i._CheckInit||, CODE, READONLY, ALIGN=2
_CheckInit PROC
;;;254 */
;;;255 static void _CheckInit(void) {
000000 4803 LDR r0,|L10.16|
;;;256 if (!IsInitialized) {
000002 7800 LDRB r0,[r0,#0] ; IsInitialized
000004 2800 CMP r0,#0
000006 d101 BNE |L10.12|
;;;257 GUI_ALLOC_Init();
000008 f7ffbffe B.W GUI_ALLOC_Init
|L10.12|
;;;258 }
;;;259 }
00000c 4770 BX lr
;;;260
ENDP
00000e 0000 DCW 0x0000
|L10.16|
DCD ||.data||
AREA ||i._CreateHole||, CODE, READONLY, ALIGN=2
_CreateHole PROC
;;;229 */
;;;230 static GUI_HMEM _CreateHole(GUI_ALLOC_DATATYPE Size) {
000000 e92d41f0 PUSH {r4-r8,lr}
000004 4680 MOV r8,r0
;;;231 int i, iNext;
;;;232 int r = -1;
000006 f04f37ff MOV r7,#0xffffffff
;;;233 for (i=0; (iNext =aBlock[i].Next) !=0; i= iNext) {
00000a 2000 MOVS r0,#0
;;;234 GUI_ALLOC_DATATYPE NumFreeBytes = aBlock[iNext].Off- (aBlock[i].Off+aBlock[i].Size);
00000c 4e17 LDR r6,|L11.108|
00000e e019 B |L11.68|
|L11.16|
000010 f8362030 LDRH r2,[r6,r0,LSL #3]
000014 8849 LDRH r1,[r1,#2]
000016 f9360034 LDRSH r0,[r6,r4,LSL #3]
00001a 4411 ADD r1,r1,r2
00001c 1a41 SUBS r1,r0,r1
00001e b20d SXTH r5,r1
;;;235 if (NumFreeBytes < Size) {
000020 4545 CMP r5,r8
000022 da0e BGE |L11.66|
;;;236 GUI_ALLOC_DATATYPE NumBytesBeforeBlock = aBlock[iNext].Off - (aBlock[i].Off+aBlock[i].Size);
;;;237 if (NumBytesBeforeBlock) {
000024 b16d CBZ r5,|L11.66|
;;;238 U8* pData = &GUI_Heap.abHeap[aBlock[iNext].Off];
000026 4912 LDR r1,|L11.112|
000028 4401 ADD r1,r1,r0
;;;239 memmove(pData-NumBytesBeforeBlock, pData, aBlock[iNext].Size);
00002a eb0600c4 ADD r0,r6,r4,LSL #3
00002e f9b02002 LDRSH r2,[r0,#2]
000032 1b48 SUBS r0,r1,r5
000034 f7fffffe BL __aeabi_memmove
;;;240 aBlock[iNext].Off -=NumBytesBeforeBlock;
000038 f8360034 LDRH r0,[r6,r4,LSL #3]
00003c 1b40 SUBS r0,r0,r5
00003e f8260034 STRH r0,[r6,r4,LSL #3]
|L11.66|
000042 4620 MOV r0,r4 ;233
|L11.68|
000044 eb0601c0 ADD r1,r6,r0,LSL #3 ;233
000048 888c LDRH r4,[r1,#4] ;233
00004a 2c00 CMP r4,#0 ;233
00004c d1e0 BNE |L11.16|
;;;241 }
;;;242 }
;;;243 }
;;;244 /* Check last block */
;;;245 if (GUI_ALLOC_SIZE - (aBlock[i].Off+aBlock[i].Size) >= Size) {
00004e eb0601c0 ADD r1,r6,r0,LSL #3
000052 f9362030 LDRSH r2,[r6,r0,LSL #3]
000056 f9b13002 LDRSH r3,[r1,#2]
00005a 441a ADD r2,r2,r3
00005c f5c25220 RSB r2,r2,#0x2800
000060 4542 CMP r2,r8
000062 db00 BLT |L11.102|
;;;246 r = i;
000064 4607 MOV r7,r0
|L11.102|
;;;247 }
;;;248 return r;
000066 b238 SXTH r0,r7
;;;249 }
000068 e8bd81f0 POP {r4-r8,pc}
;;;250
ENDP
|L11.108|
DCD ||.bss||+0x2800
|L11.112|
DCD ||.bss||
AREA ||i._Free||, CODE, READONLY, ALIGN=2
_Free PROC
;;;151 */
;;;152 static void _Free(GUI_HMEM hMem) {
000000 4a10 LDR r2,|L12.68|
000002 b510 PUSH {r4,lr}
;;;153 GUI_ALLOC_DATATYPE Size;
;;;154 GUI_DEBUG_LOG1("\nGUI_ALLOC_Free(%d)", hMem);
;;;155 /* Do some error checking ... */
;;;156 #if GUI_DEBUG_LEVEL>0
;;;157 /* Block not allocated ? */
;;;158 if (aBlock[hMem].Size == 0) {
000004 eb0200c0 ADD r0,r2,r0,LSL #3
000008 f9b01002 LDRSH r1,[r0,#2]
00000c 2900 CMP r1,#0
00000e d018 BEQ |L12.66|
;;;159 GUI_DEBUG_ERROROUT("GUI_ALLOC_Free(): Invalid hMem");
;;;160 return;
;;;161 }
;;;162 #endif
;;;163 Size = aBlock[hMem].Size;
;;;164 #ifdef WIN32
;;;165 GUI_MEMSET(&GUI_Heap.abHeap[aBlock[hMem].Off], 0xcc, Size);
;;;166 #endif
;;;167 GUI_ALLOC.NumFreeBytes += Size;
000010 f5026321 ADD r3,r2,#0xa10
000014 89dc LDRH r4,[r3,#0xe] ; GUI_ALLOC
000016 440c ADD r4,r4,r1
000018 81dc STRH r4,[r3,#0xe]
;;;168 GUI_ALLOC.NumUsedBytes -= Size;
00001a 899c LDRH r4,[r3,#0xc] ; GUI_ALLOC
00001c 1a61 SUBS r1,r4,r1
00001e 8199 STRH r1,[r3,#0xc]
;;;169 aBlock[hMem].Size = 0;
000020 2100 MOVS r1,#0
000022 8041 STRH r1,[r0,#2]
;;;170 {
;;;171 int Next = aBlock[hMem].Next;
000024 8881 LDRH r1,[r0,#4]
;;;172 int Prev = aBlock[hMem].Prev;
000026 88c0 LDRH r0,[r0,#6]
;;;173 aBlock[Prev].Next = Next;
000028 eb0204c0 ADD r4,r2,r0,LSL #3
00002c 80a1 STRH r1,[r4,#4]
;;;174 if (Next) {
00002e b111 CBZ r1,|L12.54|
;;;175 aBlock[Next].Prev = Prev;
000030 eb0201c1 ADD r1,r2,r1,LSL #3
000034 80c8 STRH r0,[r1,#6]
|L12.54|
;;;176 }
;;;177 }
;;;178 GUI_ALLOC.NumFreeBlocks++;
000036 6858 LDR r0,[r3,#4] ; GUI_ALLOC
000038 1c40 ADDS r0,r0,#1
;;;179 GUI_ALLOC.NumUsedBlocks--;
00003a 6058 STR r0,[r3,#4] ; GUI_ALLOC
00003c 6818 LDR r0,[r3,#0] ; GUI_ALLOC
00003e 1e40 SUBS r0,r0,#1
;;;180 }
000040 6018 STR r0,[r3,#0] ; GUI_ALLOC
|L12.66|
000042 bd10 POP {r4,pc}
;;;181
ENDP
|L12.68|
DCD ||.bss||+0x2800
AREA ||.bss||, DATA, NOINIT, ALIGN=2
GUI_Heap
% 10240
aBlock
% 2576
GUI_ALLOC
% 20
AREA ||.data||, DATA, ALIGN=0
IsInitialized
000000 00 DCB 0x00
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -