strchar php,QT中char * str = "hello"问题

为了排除printf出问题的可能,我把代码中的printf都去掉,但现象依旧。

下面是对两个版本代码对应的汇编,首先上QT版无错误的汇编代码:

#include

#include

int main(int argc, char *argv[])

{

4013b0:    55                       push   %ebp

4013b1:    89 e5                    mov    %esp,%ebp

4013b3:    83 e4 f0                 and    $0xfffffff0,%esp

4013b6:    56                       push   %esi

4013b7:    53                       push   %ebx

4013b8:    83 ec 28                 sub    $0x28,%esp

4013bb:    e8 00 40 00 00           call   4053c0 <___main>

QCoreApplication a(argc, argv);

4013c0:    8b 45 0c                 mov    0xc(%ebp),%eax

4013c3:    89 44 24 08              mov    %eax,0x8(%esp)

4013c7:    8d 45 08                 lea    0x8(%ebp),%eax

4013ca:    89 44 24 04              mov    %eax,0x4(%esp)

4013ce:    8d 44 24 14              lea    0x14(%esp),%eax

4013d2:    89 04 24                 mov    %eax,(%esp)

4013d5:    a1 a8 12 41 00           mov    0x4112a8,%eax

4013da:    ff d0                    call   *%eax

char * str = "hello";

4013dc:    c7 44 24 1c a8 ca 40     movl   $0x40caa8,0x1c(%esp)

4013e3:    00

str[2] = 'b';

4013e4:    8b 44 24 1c              mov    0x1c(%esp),%eax

4013e8:    83 c0 02                 add    $0x2,%eax

4013eb:    c6 00 62                 movb   $0x62,(%eax)

return a.exec();

4013ee:    a1 a4 12 41 00           mov    0x4112a4,%eax

4013f3:    ff d0                    call   *%eax

4013f5:    89 c3                    mov    %eax,%ebx

4013f7:    8d 44 24 14              lea    0x14(%esp),%eax

4013fb:    89 04 24                 mov    %eax,(%esp)

4013fe:    a1 ac 12 41 00           mov    0x4112ac,%eax

401403:    ff d0                    call   *%eax

401405:    89 d8                    mov    %ebx,%eax

}

可以注意到

char * str = "hello";

4013dc:    c7 44 24 1c a8 ca 40     movl   $0x40caa8,0x1c(%esp)

4013e3:    00

str[2] = 'b';

4013e4:    8b 44 24 1c              mov    0x1c(%esp),%eax

4013e8:    83 c0 02                 add    $0x2,%eax

4013eb:    c6 00 62                 movb   $0x62,(%eax)

是其关键,地址0x40caa8应该就是"hello"的地址

找到这个地址的汇编代码如下:

0040caa8 <.rdata>:

40caa8:    68 65 6c 6c 6f           push   $0x6f6c6c65

40caad:    00 00                    add    %al,(%eax)

对照68 65 6c 6c 6f 就是hello对应的16进制表示,注意到这里是.rdata,属于只读数据段。后面对只读数据段进行写操作,应该会出现错误才对,可是并没有出现。。。。

下面是普通C++版,会出现错误。

汇编代码与上面类似,代码如下:

004013b0 <_main>:

#include

int main()

{

4013b0:    55                       push   %ebp

4013b1:    89 e5                    mov    %esp,%ebp

4013b3:    83 e4 f0                 and    $0xfffffff0,%esp

4013b6:    83 ec 10                 sub    $0x10,%esp

4013b9:    e8 b2 00 00 00           call   401470 <___main>

char * str = "hello";

4013be:    c7 44 24 0c 64 30 40     movl   $0x403064,0xc(%esp)

4013c5:    00

str[2] = 'b';

4013c6:    8b 44 24 0c              mov    0xc(%esp),%eax

4013ca:    83 c0 02                 add    $0x2,%eax

4013cd:    c6 00 62                 movb   $0x62,(%eax)

return 0;

4013d0:    b8 00 00 00 00           mov    $0x0,%eax

4013d5:    c9                       leave

4013d6:    c3                       ret

4013d7:    90                       nop

char * str = "hello";

4013be:    c7 44 24 0c 64 30 40     movl   $0x403064,0xc(%esp)

4013c5:    00

str[2] = 'b';

4013c6:    8b 44 24 0c              mov    0xc(%esp),%eax

4013ca:    83 c0 02                 add    $0x2,%eax

4013cd:    c6 00 62                 movb   $0x62,(%eax)

可得"hello"地址,其汇编代码如下:

00403064 <.rdata>:

403064:    68 65 6c 6c 6f           push   $0x6f6c6c65

403069:    00 00                    add    %al,(%eax)

大虾指点,指点,谢谢。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值