在vs2005下建立vc++的win32 控制台应用程序,设置stdafx.h不必要包含,设置多字符集,设置汇编输出/FAs。代码和asm解析如下:
#include <stdio.h>
int main(int argc, char* argv[])
{
char c[] = "ABC";
char *p = c;
long *i = (long*)p;
*i += 0x202020;
printf("%s/n", p);
char c1[5] = {'A',0};
return 0;
}
; 4 : char c[] = "ABC";
mov eax, DWORD PTR ??_C@_03FFFJFKND@ABC?$AA@;取字符串地址
mov DWORD PTR _c$[ebp], eax;c变量只是栈上一个4byte的空间,存的是字符串的地址
; 5 : char *p = c;
lea eax, DWORD PTR _c$[ebp];Load Effective Address
mov DWORD PTR _p$[ebp], eax;p变量只是栈上一个4byte的空间,字符串指针对象
; 6 : long *i = (long*)p;
mov eax, DWORD PTR _p$[ebp];强制指针转换在编译器做完,编译结果没有痕迹
mov DWORD PTR _i$[ebp], eax
; 7 : *i += 0x202020;;考虑intel是little endian。此处加0x202020后就变为小写字符串
mov eax, DWORD PTR _i$[ebp]
mov ecx, DWORD PTR [eax]
add ecx, 2105376 ; 00202020H
mov edx, DWORD PTR _i$[ebp]
mov DWORD PTR [edx], ecx
; 9 : char c1[5] = {'A',0};
mov BYTE PTR _c1$[ebp], 65 ; 00000041H;c1变量仅在开发环境中是个对象,编译后只是一个有地址的内存空间
mov BYTE PTR _c1$[ebp+1], 0
xor eax, eax
mov WORD PTR _c1$[ebp+2], ax;接着自动初始化字符串
mov BYTE PTR _c1$[ebp+4], al