#include<stdio.h>
#include<stdlib.h>
int main()
{
char *str=(char*)malloc(50);
str[0]='a';
13
14 str[1]='b';
15
16 str[2]='c';
17
18 str[3]='d';
19 str[4]='e';
20 str[5]='f';
21 str[6]='g';
22 str[7]='h';
23 str[8]='i';
24 str[9]='j';
25 str[10]='k';
return 0;
}
(gdb) disassemble
Dump of assembler code for function main:
0x0000000000400526 <+0>: push %rbp
0x0000000000400527 <+1>: mov %rsp,%rbp
0x000000000040052a <+4>: sub $0x10,%rsp
0x000000000040052e <+8>: mov $0x32,%edi
0x0000000000400533 <+13>: callq 0x400410 <malloc@plt>
0x0000000000400538 <+18>: mov %rax,-0x8(%rbp) ##
0x000000000040053c <+22>: mov -0x8(%rbp),%rax ##你这两句是闹着玩呢,不是一个意思么
0x0000000000400540 <+26>: movb $0x61,(%rax)
=> 0x0000000000400543 <+29>: mov -0x8(%rbp),%rax
0x0000000000400547 <+33>: movb $0x62,(%rax)
0x000000000040054a <+36>: mov -0x8(%rbp),%rax
0x000000000040054e <+40>: movb $0x63,(%rax)
0x0000000000400551 <+43>: mov -0x8(%rbp),%rax
0x0000000000400555 <+47>: movb $0x64,(%rax)
0x0000000000400558 <+50>: mov -0x8(%rbp),%rax
0x000000000040055c <+54>: movb $0x65,(%rax)
0x000000000040055f <+57>: mov -0x8(%rbp),%rax
0x0000000000400563 <+61>: movb $0x66,(%rax)
0x0000000000400566 <+64>: mov -0x8(%rbp),%rax
0x000000000040056a <+68>: movb $0x67,(%rax)
0x000000000040056d <+71>: mov -0x8(%rbp),%rax
0x0000000000400571 <+75>: movb $0x68,(%rax)
0x0000000000400574 <+78>: mov -0x8(%rbp),%rax
0x0000000000400578 <+82>: movb $0x69,(%rax)
0x000000000040057b <+85>: mov -0x8(%rbp),%rax
0x000000000040057f <+89>: movb $0x6a,(%rax)
0x0000000000400582 <+92>: mov -0x8(%rbp),%rax
0x0000000000400586 <+96>: movb $0x6b,(%rax)
0x0000000000400589 <+99>: mov $0x0,%eax
0x000000000040058e <+104>: leaveq
0x000000000040058f <+105>: retq
End of assembler dump.
解释案例:
0x0000000000400582 <+92>: mov -0x8(%rbp),%rax
0x0000000000400586 <+96>: movb $0x6b,(%rax)
mov -0x8(%rbp),%rax
#rbp保存的地址是 0x7fffffffdcb0, -0x8(%rbp)就是0x7fffffffdca8, 这个0x7fffffffdca8 的内存空间保存着一个地址数据, 这个地址数据是0x602010, 0x602010是堆区的一块内内存空间地址, 这个0x602010地址指向的空间里保存着一个数据0
所以print *0x7fffffffdca8 就是 0x602010, print *0x602010 就是 0
"--->"是表示指向的意思
rbp:0x0x7fffffffdca8 --->0x602010--->0
rax:0x602010--->0
回到案例:
0x0000000000400582 <+92>: mov -0x8(%rbp),%rax
0x0000000000400586 <+96>: movb $0x6b,(%rax)
所以 mov -0x8(%rbp),%rax 就是将0x602010这个地址传送给了 rax 寄存器, 也就是rax 寄存器保存了这个0x602010这个地址
movb $0x6b,(%rax) (%rax) 表示引用rax 所指向的空间, 所以这句就是将一个含有0x6b这个值的字节传送给了rax 所指向的内存的空间
进入堆区:
(gdb) disas
Dump of assembler code for function malloc@plt:
=> 0x0000000000400410 <+0>: jmpq *0x200c0a(%rip) # 0x601020
0x0000000000400416 <+6>: pushq $0x1
0x000000000040041b <+11>: jmpq 0x4003f0
End of assembler dump.
这地方还不懂, 汇编语言怎么动态分配内存的....哎,待续.....