第一次SO用户在这里。
我试图更好地理解Unicode,utf-8等。目前我正在从Windows命令提示符处执行此操作。
是否可以在Visual Studio中发布反汇编转储?
#define UNICODE
#include <windows.h>
#ifdef _UNICODE
UC = 0x1;
#else
UC = 0x2;
#endif
#ifdef _MBCS
UM = 0x4;
#else
UM = 0x8;
#endif
int main()
{
00007FF65B276270 40 56 push rsi
00007FF65B276272 57 push rdi
00007FF65B276273 48 83 EC 78 sub rsp,78h
00007FF65B276277 48 8B 05 B2 2D 01 00 mov rax,qword ptr [__security_cookie (07FF65B289030h)]
00007FF65B27627E 48 33 C4 xor rax,rsp
00007FF65B276281 48 89 44 24 68 mov qword ptr [rsp+68h],rax
UINT cs = UC | UM;
00007FF65B276286 8B 05 78 43 01 00 mov eax,dword ptr [UM (07FF65B28A604h)]
00007FF65B27628C 8B 0D 6E 43 01 00 mov ecx,dword ptr [UC (07FF65B28A600h)]
00007FF65B276292 0B C8 or ecx,eax
00007FF65B276294 8B C1 mov eax,ecx
00007FF65B276296 89 44 24 38 mov dword ptr [cs],eax
TCHAR streng[] = TEXT("aæbøcådÆeØfÅg");
00007FF65B27629A 48 8D 44 24 40 lea rax,[streng]
00007FF65B27629F 48 8D 0D 62 43 01 00 lea rcx,[UM+4h (07FF65B28A608h)]
00007FF65B2762A6 48 8B F8 mov rdi,rax
00007FF65B2762A9 48 8B F1 mov rsi,rcx
00007FF65B2762AC B9 28 00 00 00 mov ecx,28h
00007FF65B2762B1 F3 A4 rep movs byte ptr [rdi],byte ptr [rsi]
HANDLE hConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE);
00007FF65B2762B3 B9 F5 FF FF FF mov ecx,0FFFFFFF5h
00007FF65B2762B8 FF 15 42 9D 01 00 call qword ptr [__imp_GetStdHandle (07FF65B290000h)]
00007FF65B2762BE 48 89 44 24 30 mov qword ptr [hConsoleOutput],rax
WriteConsole(hConsoleOutput, streng, _tcslen(streng), 0, 0);
00007FF65B2762C3 48 8D 4C 24 40 lea rcx,[streng]
00007FF65B2762C8 E8 6F B1 FE FF call _mbslen (07FF65B26143Ch)
00007FF65B2762CD 48 C7 44 24 20 00 00 00 00 mov qword ptr [rsp+20h],0
00007FF65B2762D6 45 33 C9 xor r9d,r9d
00007FF65B2762D9 44 8B C0 mov r8d,eax
00007FF65B2762DC 48 8D 54 24 40 lea rdx,[streng]
00007FF65B2762E1 48 8B 4C 24 30 mov rcx,qword ptr [hConsoleOutput]
00007FF65B2762E6 FF 15 1C 9D 01 00 call qword ptr [__imp_WriteConsoleW (07FF65B290008h)]
return 0;
00007FF65B2762EC 33 C0 xor eax,eax
}
00007FF65B2762EE 48 8B 4C 24 68 mov rcx,qword ptr [rsp+68h]
00007FF65B2762F3 48 33 CC xor rcx,rsp
00007FF65B2762F6 E8 55 AE FE FF call __security_check_cookie (07FF65B261150h)
00007FF65B2762FB 48 83 C4 78 add rsp,78h
00007FF65B2762FF 5F pop rdi
00007FF65B276300 5E pop rsi
00007FF65B276301 C3 ret
当the documentation声明_mbslen仅在定义_MBCS时使用_mbslen时,我无法弄清楚为什么_tcslen(streng)
被编译为对_mbslen
的调用。
我使用cl -Zi main.c
编译,当我devenv main.exe
时,我可以确认_UNICODE和_MBCS都没有用行UINT cs = UC | UM;
定义(cs是0xa)。
如果我删除了我定义UNICODE的第一行,并且我将命令提示符中的代码页设置为65001,那么一切正常,因为我用utf-8保存了源文件。如果我保持UNICODE定义但硬编码wcslen(streng)
和字符串中的代码点,它也可以工作。这让我相信,即使_tcslen变成了wcslen,除非我将Unicode代码点硬编码到字符串中,否则它将无法工作。但这不是重点。我想知道为什么编译器选择调用_mbslen而不是wcslen。