汇编字符串赋值详解

   
char* test1()
26:   {
00401590   push        ebp
00401591   mov         ebp,esp
00401593   sub         esp,44h
00401596   push        ebx
00401597   push        esi
00401598   push        edi
00401599   lea         edi,[ebp-44h]
0040159C   mov         ecx,11h
004015A1   mov         eax,0CCCCCCCCh
004015A6   rep stos    dword ptr [edi]
27:       char* pstr = "Hello"; //“Hello”在内存的数据区。即data标签里
004015A8   mov         dword ptr [ebp-4],offset string "Hello" (0046f01c) //直接将“Hello”的地址赋给pstr ,而不是里面的内容。
28:   //  pstr = "123";
29:       return pstr;
004015AF   mov         eax,dword ptr [ebp-4] //由 eax返回给调用函数
30:   }
004015B2   pop         edi
004015B3   pop         esi
004015B4   pop         ebx
004015B5   mov         esp,ebp
004015B7   pop         ebp
004015B8   ret
//test2 
32:   char* test2()
33:   {
004015D0   push        ebp
004015D1   mov         ebp,esp
004015D3   sub         esp,48h
004015D6   push        ebx
004015D7   push        esi
004015D8   push        edi
004015D9   lea         edi,[ebp-48h]
004015DC   mov         ecx,12h
004015E1   mov         eax,0CCCCCCCCh
004015E6   rep stos    dword ptr [edi]
34:       char pstr[] = "Hello2"; ///用数组定义
004015E8   mov         eax,[string "Hello2" (0046f024)] //先将“Hello2”这个些数据复制到eax中去,
004015ED   mov         dword ptr [ebp-8],eax //在栈中的[ebp-8] 复制eax的数据,但因eax只有32位,所以只能复制“Hell”四个字母,每字母8位,即 4*8 = 32
004015F0   mov         cx,word ptr [string "Hello2"+4 (0046f028)] //然后,继续将数据区的剩余数据复制到栈中,注意此时的栈是本函数的栈,当本函数返回,而主函数再调用其他函数时,本区的栈将会变成其他函数的数据,这也是临时变量的具体含义吧。
004015F7   mov         word ptr [ebp-4],cx
004015FB   mov         dl,byte ptr [string "Hello2"+6 (0046f02a)]
00401601   mov         byte ptr [ebp-2],dl //最后一个byte型的是 “00”,即是字符串最后的‘\0’。以保证字符串结束。
35:
36:       return pstr;

00401604   lea         eax,[ebp-8] //也是由eax返回一个地址给调用函数
37:   }
00401607   pop         edi
00401608   pop         esi
00401609   pop         ebx
0040160A   mov         esp,ebp
0040160C   pop         ebp
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值