综述:
执行效率: do while > while / goto > for
1. goto
1.1 源码
int password{ 98765432 };
int crackPass{};
//goto
lcrack:
if (crackPass != password)
{
crackPass ++;
goto lcrack;
}
std::cout << "密码为 " << crackPass <<std::endl;
1.2. 汇编代码
//goto 7行汇编代码
lcrack:
if (crackPass != password)
00D32646 mov eax,dword ptr [crackPass]
00D32649 cmp eax,dword ptr [password] // 比较
00D3264C je lcrack+13h (0D32659h) //判断是否相等
{
crackPass ++;
00D3264E mov eax,dword ptr [crackPass]
00D32651 add eax,1
00D32654 mov dword ptr [crackPass],eax
goto lcrack;
00D32657 jmp lcrack (0D32646h)
}
std::cout << "密码为 " << crackPass <<std::endl;
2. for 循环
2.1. 源码
for (crackPass = 0; crackPass != password; crackPass++)
if (crackPass == password) break;
std::cout << "密码为 " << crackPass << std::endl;
2.2. 汇编
//for 汇编代码 12行
for (crackPass = 0; crackPass != password; crackPass++)
00D32698 mov dword ptr [crackPass],0 //初始化
00D3269F jmp lcrack+64h (0D326AAh) // 跳转到 0D326AA
00D326A1 mov eax,dword ptr [crackPass]
00D326A4 add eax,1
00D326A7 mov dword ptr [crackPass],eax
00D326AA mov eax,dword ptr [crackPass]
00D326AD cmp eax,dword ptr [password]
00D326B0 je lcrack+78h (0D326BEh)
if (crackPass == password) break;
00D326B2 mov eax,dword ptr [crackPass]
00D326B5 cmp eax,dword ptr [password]
00D326B8 jne lcrack+76h (0D326BCh)
00D326BA jmp lcrack+78h (0D326BEh)
std::cout << "密码为 " << crackPass << std::endl;
3. while
3.1. 源码
crackPass = 0;
while (crackPass != password)crackPass++;
std::cout << "密码为 " << crackPass << std::endl;
3.2. 汇编
crackPass = 0;
00D326FD mov dword ptr [crackPass],0
while (crackPass != password)crackPass++;
00D32704 mov eax,dword ptr [crackPass]
00D32707 cmp eax,dword ptr [password]
00D3270A je lcrack+0D1h (0D32717h)
00D3270C mov eax,dword ptr [crackPass]
00D3270F add eax,1
00D32712 mov dword ptr [crackPass],eax
00D32715 jmp lcrack+0BEh (0D32704h)
std::cout << "密码为 " << crackPass << std::endl;
4. do while
4.1. 源码
crackPass = -1;
do crackPass++; while (crackPass != password);
std::cout << "密码为 " << crackPass << std::endl;
4.2. 汇编
crackPass = -1;
00D32756 mov dword ptr [crackPass],0FFFFFFFFh
do crackPass++; while (crackPass != password);
00D3275D mov eax,dword ptr [crackPass]
00D32760 add eax,1
00D32763 mov dword ptr [crackPass],eax
00D32766 mov eax,dword ptr [crackPass]
00D32769 cmp eax,dword ptr [password]
00D3276C jne lcrack+117h (0D3275Dh)
std::cout << "密码为 " << crackPass << std::endl;