我知道这个问题有点笼统,但我一直在查看一个大型汇编文件,直到调用此函数为止:
CPU Disasm
Address Hex dump Command Comments
004149E0 /$ 55 PUSH EBP
004149E1 |. 89E5 MOV EBP,ESP
004149E3 |. 83EC 28 SUB ESP,28
004149E6 |. 895D F4 MOV DWORD PTR SS:[LOCAL.3],EBX
004149E9 |. 8B45 08 MOV EAX,DWORD PTR SS:[ARG.1]
004149EC |. 8975 F8 MOV DWORD PTR SS:[LOCAL.2],ESI
004149EF |. 897D FC MOV DWORD PTR SS:[LOCAL.1],EDI
004149F2 |. 8B00 MOV EAX,DWORD PTR DS:[EAX]
004149F4 |. 8945 E0 MOV DWORD PTR SS:[LOCAL.8],EAX
004149F7 |. 8B40 F4 MOV EAX,DWORD PTR DS:[EAX-0C]
004149FA |. 8945 E4 MOV DWORD PTR SS:[LOCAL.7],EAX
004149FD |. 8945 F0 MOV DWORD PTR SS:[LOCAL.4],EAX
00414A00 |. 8B45 0C MOV EAX,DWORD PTR SS:[ARG.2]
00414A03 |. 890424 MOV DWORD PTR SS:[LOCAL.10],EAX ;string => [ARG.2]
00414A06 |. E8 35C9FFFF CALL <JMP.&msvcrt.strlen> ;MSVCRT.strlen
00414A0B |. 8945 EC MOV DWORD PTR SS:[LOCAL.5],EAX
00414A0E |. 89C3 MOV EBX,EAX
00414A10 |. 8D45 EC LEA EAX,[LOCAL.5]
00414A13 |. 3B5D E4 CMP EBX,DWORD PTR SS:[LOCAL.7]
00414A16 |. 72 03 JB SHORT 00414A1B
00414A18 |. 8D45 F0 LEA EAX,[LOCAL.4]
00414A1B |> FC CLD
00414A1C |. 8B08 MOV ECX,DWORD PTR DS:[EAX]
00414A1E |. 8B75 E0 MOV ESI,DWORD PTR SS:[LOCAL.8]
00414A21 |. 8B7D 0C MOV EDI,DWORD PTR SS:[ARG.2]
00414A24 |. 39C9 CMP ECX,ECX
00414A26 |. F3:A6 REPE CMPS BYTE PTR DS:[ESI],BYTE PTR ES:[EDI]
00414A28 |. 0F92C0 SETB AL
00414A2B |. 0F97C2 SETA DL
00414A2E |. 28C2 SUB DL,AL
00414A30 |. 0FBEC2 MOVSX EAX,DL
00414A33 |. 85C0 TEST EAX,EAX
00414A35 |. 75 05 JNZ SHORT 00414A3C
00414A37 |. 8B45 E4 MOV EAX,DWORD PTR SS:[LOCAL.7]
00414A3A |. 29D8 SUB EAX,EBX
00414A3C |> 8B5D F4 MOV EBX,DWORD PTR SS:[LOCAL.3]
00414A3F |. 8B75 F8 MOV ESI,DWORD PTR SS:[LOCAL.2]
00414A42 |. 8B7D FC MOV EDI,DWORD PTR SS:[LOCAL.1]
00414A45 |. 89EC MOV ESP,EBP
00414A47 |. 5D POP EBP
00414A48 \. C3 RETN
这个功能真的给了我一个艰难的时间,如果你们有任何见解或者可以让我对它发生的事情大致了解我真的很感激。
我猜它可能与被检查的字符串的大小有关(可能是10个字符的长度?)同样来自我所看到的(再次,不确定)AL和EAX是那些这段代码我真的很担心。
如果需要有关此部分的更多信息,请不要犹豫,问我。
答案 0 :(得分:1)
好吧,未经优化的x86(不是x86-64)程序集非常难看(并且在启动的英特尔语法中......)
无论如何,似乎这个函数接受字符串的strlen()
,然后获取此strlen中较小的一个以及在数组或结构中传递的参数,并将其用作strncmp()
的长度参数。返回strncmp的结果。