从汇编语言角度辨析char*str="abc"和char str[]="abc"

所以说想要从根本上理解这种语言上的trick就要直接看他的汇编代码,对着经验和现象猜来猜去就如同盲人摸象。

    char*str="abc";
01092BFE  mov         dword ptr [str],109CC70h  
    char strr[]="abc";
01092C05  mov         eax,dword ptr ds:[0109CC70h]  
01092C0A  mov         dword ptr [strr],eax  

“abc”是一个常量,常量是程序在编译的时候就确定好了的东西,它就跟代码一样,在进程地址空间中,常量区就在代码段的上边,这两个区域都是只读的(这两个区域真的是只读的,跟栈内const修饰的假常量可不一样),这个109CC70h就是处于常量区的一个地址,从他开始后边4个字节里存着abc\0。

我们可以看到char*str里存的就是这个常量区的地址,你想对它进行修改是不会被允许的,因为这段内存是只读的,你修改它会造成运行时错误。这里也有个疑问,到底是系统的那部分规定无法修改虚拟内存中某些地址的,我猜测是linux内核中表示进程的task_struct中管理虚拟内存各段的链表中的某个表示权限的flag,不过目前还没有去查证。

再看strr[]的赋值操作,很明显它只是把常量区的字符串值取出来放到寄存器,再由把寄存器中的值拷贝到栈内空间,我们修改的只是栈内的空间,合理合法。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值