|
为了排除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<stdio.h>
- 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)
大虾指点,指点,谢谢。
|