📄 gui_uc_encodeutf8.txt
字号:
; generated by ARM C/C++ Compiler with , RVCT4.0 [Build 524] for uVision
; commandline ArmCC [--split_sections --debug -c --asm --interleave -o.\Obj\gui_uc_encodeutf8.o --depend=.\Obj\gui_uc_encodeutf8.d --device=DARMSTM --apcs=interwork -O3 -I..\..\include -I..\..\..\FWLib\library\inc -I..\..\..\USBLib\library\inc -I..\..\Config -I..\..\GUI\Core -I..\..\GUI\Font -I..\..\GUI\ConvertColor -I..\..\GUI\AntiAlias -I..\..\GUI\ConvertMono -I..\..\GUI\JPEG -I..\..\GUI\MemDev -I..\..\GUI\MultiLayer -I..\..\GUI\Widget -I..\..\GUI\WM -IC:\Keil\ARM\INC\ST\STM32F10x ..\..\GUI\Core\GUI_UC_EncodeUTF8.c]
THUMB
AREA ||i.GUI_UC_SetEncodeUTF8||, CODE, READONLY, ALIGN=2
GUI_UC_SetEncodeUTF8 PROC
;;;146 */
;;;147 void GUI_UC_SetEncodeUTF8(void) {
000000 4902 LDR r1,|L1.12|
;;;148 GUI_LOCK();
;;;149 GUI_Context.pUC_API = &_API_Table;
000002 4801 LDR r0,|L1.8|
;;;150 GUI_UNLOCK();
;;;151 }
000004 61c8 STR r0,[r1,#0x1c] ; GUI_Context
000006 4770 BX lr
;;;152
ENDP
|L1.8|
DCD ||.constdata||
|L1.12|
DCD GUI_Context
AREA ||i._CalcSizeOfChar||, CODE, READONLY, ALIGN=1
_CalcSizeOfChar PROC
;;;86 */
;;;87 static int _CalcSizeOfChar(U16 Char) {
000000 0ac1 LSRS r1,r0,#11
;;;88 int r;
;;;89 if (Char & 0xF800) { /* Single byte (ASCII) */
000002 d001 BEQ |L2.8|
;;;90 r = 3;
000004 2003 MOVS r0,#3
;;;91 } else if (Char & 0xFF80) { /* Double byte sequence */
;;;92 r = 2;
;;;93 } else { /* 3 byte sequence */
;;;94 r = 1;
;;;95 }
;;;96 return r;
;;;97 }
000006 4770 BX lr
|L2.8|
000008 09c0 LSRS r0,r0,#7 ;91
00000a d001 BEQ |L2.16|
00000c 2002 MOVS r0,#2 ;92
00000e 4770 BX lr
|L2.16|
000010 2001 MOVS r0,#1 ;94
000012 4770 BX lr
;;;98
ENDP
AREA ||i._Encode||, CODE, READONLY, ALIGN=1
_Encode PROC
;;;105 */
;;;106 static int _Encode(char *s, U16 Char) {
000000 b570 PUSH {r4-r6,lr}
000002 4605 MOV r5,r0
000004 460c MOV r4,r1
;;;107 int r;
;;;108 r = _CalcSizeOfChar(Char);
000006 4608 MOV r0,r1
000008 f7fffffe BL _CalcSizeOfChar
;;;109 switch (r) {
00000c 2801 CMP r0,#1
00000e d012 BEQ |L3.54|
;;;110 case 1:
;;;111 *s = (char)Char;
;;;112 break;
;;;113 case 2:
;;;114 *s++ = 0xC0 | (Char >> 6);
;;;115 *s = 0x80 | (Char & 0x3F);
000010 f004013f AND r1,r4,#0x3f
000014 f0410180 ORR r1,r1,#0x80
000018 2802 CMP r0,#2 ;109
00001a d00e BEQ |L3.58|
00001c 2803 CMP r0,#3 ;109
00001e d109 BNE |L3.52|
;;;116 break;
;;;117 case 3:
;;;118 *s++ = 0xE0 | (Char >> 12);
000020 22e0 MOVS r2,#0xe0
000022 ea423214 ORR r2,r2,r4,LSR #12
000026 702a STRB r2,[r5,#0]
;;;119 *s++ = 0x80 | ((Char >> 6) & 0x3F);
000028 f3c41285 UBFX r2,r4,#6,#6
00002c f0420280 ORR r2,r2,#0x80
000030 706a STRB r2,[r5,#1]
;;;120 *s = 0x80 | (Char & 0x3F);
000032 70a9 STRB r1,[r5,#2]
|L3.52|
;;;121 break;
;;;122 }
;;;123 return r;
;;;124 }
000034 bd70 POP {r4-r6,pc}
|L3.54|
000036 702c STRB r4,[r5,#0] ;111
000038 bd70 POP {r4-r6,pc}
|L3.58|
00003a 22c0 MOVS r2,#0xc0 ;114
00003c ea421294 ORR r2,r2,r4,LSR #6 ;114
000040 702a STRB r2,[r5,#0] ;114
000042 7069 STRB r1,[r5,#1] ;115
000044 bd70 POP {r4-r6,pc}
;;;125
ENDP
AREA ||i._GetCharCode||, CODE, READONLY, ALIGN=1
_GetCharCode PROC
;;;34 */
;;;35 static U16 _GetCharCode(const char GUI_UNI_PTR * s) {
000000 4601 MOV r1,r0
;;;36 U16 r;
;;;37 U8 Char = *(const U8*)s;
000002 7800 LDRB r0,[r0,#0]
;;;38 if ((Char & 0x80) == 0) { /* Single byte (ASCII) */
000004 0602 LSLS r2,r0,#24
000006 d516 BPL |L4.54|
;;;39 r = Char;
;;;40 } else if ((Char & 0xe0) == 0xc0) { /* Double byte sequence */
000008 2206 MOVS r2,#6
00000a ebb21f50 CMP r2,r0,LSR #5
00000e d103 BNE |L4.24|
;;;41 r = (Char & 0x1f) << 6;
000010 06c0 LSLS r0,r0,#27
000012 0d40 LSRS r0,r0,#21
;;;42 Char = *(++s);
000014 7849 LDRB r1,[r1,#1]
;;;43 Char &= 0x3f;
;;;44 r |= Char;
000016 e00b B |L4.48|
|L4.24|
;;;45 } else if ((Char & 0xf0) == 0xe0) { /* 3 byte sequence */
000018 220e MOVS r2,#0xe
00001a ebb21f10 CMP r2,r0,LSR #4
00001e d10b BNE |L4.56|
;;;46 r = (Char & 0x0f) << 12;
000020 0700 LSLS r0,r0,#28
000022 0c02 LSRS r2,r0,#16
;;;47 Char = *(++s);
000024 7848 LDRB r0,[r1,#1]
;;;48 Char &= 0x3f;
;;;49 r |= (Char << 6);
;;;50 Char = *(++s);
000026 7889 LDRB r1,[r1,#2]
000028 f000003f AND r0,r0,#0x3f ;48
00002c ea421080 ORR r0,r2,r0,LSL #6 ;49
|L4.48|
000030 f001013f AND r1,r1,#0x3f ;43
000034 4308 ORRS r0,r0,r1 ;44
|L4.54|
;;;51 Char &= 0x3f;
;;;52 r |= Char;
;;;53 } else {
;;;54 GUI_DEBUG_ERROROUT("Illegal character during UTF-8 decoding!");
;;;55 r = 1; /* Illegal character. To avoid endless loops in upper layers, we return 1 rather than 0. */
;;;56 }
;;;57 return r;
;;;58 }
000036 4770 BX lr
|L4.56|
000038 2001 MOVS r0,#1 ;55
00003a 4770 BX lr
;;;59
ENDP
AREA ||i._GetCharSize||, CODE, READONLY, ALIGN=1
_GetCharSize PROC
;;;66 */
;;;67 static int _GetCharSize(const char GUI_UNI_PTR * s) {
000000 7800 LDRB r0,[r0,#0]
;;;68 U8 Char = *s;
;;;69 if ((Char & 0x80) == 0) {
000002 0601 LSLS r1,r0,#24
000004 d50b BPL |L5.30|
;;;70 return 1;
;;;71 } else if ((Char & 0xe0) == 0xc0) {
000006 2106 MOVS r1,#6
000008 ebb11f50 CMP r1,r0,LSR #5
00000c d101 BNE |L5.18|
;;;72 return 2;
00000e 2002 MOVS r0,#2
;;;73 } else if ((Char & 0xf0) == 0xe0) {
;;;74 return 3;
;;;75 }
;;;76 GUI_DEBUG_ERROROUT("Illegal character during UTF-8 decoding!");
;;;77 return 1; /* Illegal character. To avoid endless loops in upper layers, we return 1 rather than 0. */
;;;78 }
000010 4770 BX lr
|L5.18|
000012 210e MOVS r1,#0xe ;73
000014 ebb11f10 CMP r1,r0,LSR #4 ;73
000018 d101 BNE |L5.30|
00001a 2003 MOVS r0,#3 ;74
00001c 4770 BX lr
|L5.30|
00001e 2001 MOVS r0,#1 ;77
000020 4770 BX lr
;;;79
ENDP
AREA ||.constdata||, DATA, READONLY, ALIGN=2
_API_Table
DCD _GetCharCode
DCD _GetCharSize
DCD _CalcSizeOfChar
DCD _Encode
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -