设为首页 加入收藏

TOP

从汇编的角度分析C语言(一)char *p与char p[]的区别
2014-11-23 23:40:01 来源: 作者: 【 】 浏览:7
Tags:汇编 角度 分析 语言 char 区别

C语言代码:

#include

#include

void main()

{

char array1[] = { "123456" };

char *pointer1 = "123456";

}

汇编代码:

(gdb) disassemble main

Dump of assembler code for function main:

0x08048394 <+0>: push %ebp

0x08048395 <+1>: mov %esp,%ebp

0x08048397 <+3>: sub $0x10,%esp

0x0804839a <+6>: movl $0x34333231,-0xb(%ebp)

0x080483a1 <+13>: movw $0x3635,-0x7(%ebp)

0x080483a7 <+19>: movb $0x0,-0x5(%ebp)

0x080483ab <+23>: movl $0x8048484,-0x4(%ebp)

0x080483b2 <+30>: leave

0x080483b3 <+31>: ret

End of assembler dump.

(gdb) x/7xb 0x8048484

0x8048484 <__dso_handle+4>: 0x31 0x32 0x33 0x34 0x35 0x36 0x00

(gdb)

从<+6><+13><+19>三行可以看出,程序为array1分配了7bytes的内存空间,用来存储“123456”+‘\0’。

而<+23>行表示将地址0x8048484赋给了pointer1,我们可以查看内存0x8048484之后内容,7bytes正好为“123456”+‘\0’,这里pointer1只是一个指针,并没有为其分配内存单元。

那么下面的这段代码就不难理解了。

#include

#include

void main()

{

char array1[] = { "123456" };

char array2[] = { "123456" };

char *pointer1 = "123456";

char *pointer2 = "123456";

}

汇编代码:

(gdb) disassemble main

Dump of assembler code for function main:

0x08048394 <+0>: push %ebp

0x08048395 <+1>: mov %esp,%ebp

0x08048397 <+3>: sub $0x20,%esp

0x0804839a <+6>: movl $0x34333231,-0xf(%ebp)

0x080483a1 <+13>: movw $0x3635,-0xb(%ebp)

0x080483a7 <+19>: movb $0x0,-0x9(%ebp)

0x080483ab <+23>: movl $0x34333231,-0x16(%ebp)

0x080483b2 <+30>: movw $0x3635,-0x12(%ebp)

0x080483b8 <+36>: movb $0x0,-0x10(%ebp)

0x080483bc <+40>: movl $0x8048494,-0x4(%ebp)

0x080483c3 <+47>: movl $0x8048494,-0x8(%ebp)

0x080483ca <+54>: leave

0x080483cb <+55>: ret

End of assembler dump.

(gdb) x/7xb 0x8048494

0x8048494 <__dso_handle+4>: 0x31 0x32 0x33 0x34 0x35 0x36 0x00

(gdb)

接着这段代码也就顺其自然了!

(gdb) disassemble main

Dump of assembler code for function main:

0x08048394 <+0>: push %ebp

0x08048395 <+1>: mov %esp,%ebp

0x08048397 <+3>: sub $0x20,%esp

0x0804839a <+6>: movl $0x34333231,-0xf(%ebp)

0x080483a1 <+13>: movw $0x3635,-0xb(%ebp)

0x080483a7 <+19>: movb $0x0,-0x9(%ebp)

0x080483ab <+23>: movl $0x34333231,-0x16(%ebp)

0x080483b2 <+30>: movw $0x3635,-0x12(%ebp)

0x080483b8 <+36>: movb $0x0,-0x10(%ebp)

0x080483bc <+40>: movl $0x8048494,-0x4(%ebp)

0x080483c3 <+47>: movl $0x804849b,-0x8(%ebp)

0x080483ca <+54>: leave

0x080483cb <+55>: ret

End of assembler dump.

(gdb) x/7xb 0x8048494

0x8048494 <__dso_handle+4>: 0x31 0x32 0x33 0x34 0x35 0x36 0x00

(gdb) x/9xb 0x804849b

0x804849b <__dso_handle+11>: 0x31 0x32 0x33 0x34 0x35 0x36 0x37 0x38

0x80484a3 <__dso_handle+19>: 0x00

(gdb)

摘自 sg131971(七夜)的学习笔记

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇段错误bug的调试 下一篇HDOJ 2159 FATE (二维背包)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: