汇编字符串赋值详解

   
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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值