1.用数组存取字符串
- #include <stdio.h>
- void main()
- {
- char string[] = "Fuck you!";
-
- printf("%s\n", string);
- }
在VS在通过反汇编
对应于char string[] = "Fuck you!";语句的汇编代码为
- 00D113A8 mov eax,dword ptr [string "Fuck you!" (0D15740h)]
- 00D113AD mov dword ptr [ebp-14h],eax
- 00D113B0 mov ecx,dword ptr ds:[0D15744h]
- 00D113B6 mov dword ptr [ebp-10h],ecx
- 00D113B9 mov dx,word ptr ds:[0D15748h]
- 00D113C0 mov word ptr [ebp-0Ch],dx
使用32位的寄存器,每次可以存放4个字节。但是CPU寄存器的数量是有限的。于是使用下面的代码再次进行实验。
- #include <stdio.h>
- void main()
- {
- char string[] = “Fuck you! Fuck you! Fuck you! Fuck you! Fuck you!”;
-
- printf("%s\n", string);
- }
对应于char string[] = "Fuck you! Fuck you! Fuck you! Fuck you! Fuck you!";的汇编代码为:
- 00FA13A8 mov ecx,0Ch
- 00FA13AD mov esi,offset string "Fuck you! Fuck you! Fuck you! Fu"... (0FA5A10h)
- 00FA13B2 lea edi,[ebp-3Ch]
- 00FA13B5 rep movs dword ptr es:[edi],dword ptr [esi]
- 00FA13B7 movs word ptr es:[edi],word ptr [esi]
语句中的字符串过长以后,对应的存放方式和之前的有些区别了。
当寄存器无法存放下字符串的时候,编译器就使用内存的方式来进行存放了。
2.用指针存取字符串
- #include <stdio.h>
- void main()
- {
- char *string = "Fuck you!";
-
- printf("%s\n", string);
- }
对应于char *string = "Fuck you!";语句的汇编代码为
- 0110139E mov dword ptr [string],offset string "Fuck you!" (1105740h)
这里将"Fuck you!"的偏移地址(1105740h)存放到栈中