编译器背后的小故事(二)

2014-11-24 11:26:12 · 作者: · 浏览: 2
q 0x400940 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt>
0x0000000000400b3e : lea -0x30(%rbp),%rdi //ca的栈地址!
0x0000000000400b42 : mov $0x64,%esi
0x0000000000400b47 : callq 0x400d36 //调用A构造函数
0x0000000000400b4c : lea -0x30(%rbp),%rax
0x0000000000400b50 : mov %rax,-0x28(%rbp) //pca的栈地址!
0x0000000000400b54 : mov -0x28(%rbp),%rax
0x0000000000400b58 : movl $0x32,(%rax) //pca所地址(即ca),赋值0x32(50)
0x0000000000400b5e : mov -0x28(%rbp),%rax //从右向左压栈 ,先取出pca值
0x0000000000400b62 : mov (%rax),%r12d //取出pca所指内存值
0x0000000000400b65 : mov -0x30(%rbp),%ebx //取出ca值
0x0000000000400b68 : mov $0x400e5d,%esi //
0x0000000000400b6d : mov $0x601300,%edi //压栈esi、edi,装备调用callq
0x0000000000400b72 : callq 0x400940 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt>
0x0000000000400b77 : mov %rax,%rdi
0x0000000000400b7a : mov $0x400e6c,%esi
0x0000000000400b7f : callq 0x400940 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt>
0x0000000000400b84 : mov %rax,%rdi
0x0000000000400b87 : mov %ebx,%esi
0x0000000000400b89 : callq 0x4008e0 <_ZNSolsEi@plt>
0x0000000000400b8e : mov %rax,%rdi
0x0000000000400b91 : mov $0x400e79,%esi
0x0000000000400b96 : callq 0x400940 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt>
0x0000000000400b9b : mov %rax,%rdi
0x0000000000400b9e : mov %r12d,%esi
0x0000000000400ba1 : callq 0x4008e0 <_ZNSolsEi@plt>
0x0000000000400ba6 : mov %rax,%rdi
0x0000000000400ba9 : mov $0x4009a0,%esi
0x0000000000400bae : callq 0x400990 <_ZNSolsEPFRSoS_E@plt>

***********************************test2*********************************************

0x0000000000400bb3 : mov $0x400e89,%esi
0x0000000000400bb8 : mov $0x601300,%edi
0x0000000000400bbd : callq 0x400940 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt>
0x0000000000400bc2 : movl $0x64,-0x34(%rbp) //a地址,ox64(100)放入此处
0x0000000000400bc9 : lea -0x34(%rbp),%rax
0x0000000000400bcd : mov %rax,-0x20(%rbp) //pi地址,放入a地址
0x0000000000400bd1 : mov -0x20(%rbp),%rax //取出pi地址
0x0000000000400bd5 : movl $0x32,(%rax) //pi所指内容(即a)赋值50
0x0000000000400bdb : mov -0x20(%rbp),%rax //从右向左压栈 ,先取出pi值
0x0000000000400bdf : mov (%rax),%ebx //pi所指内存值
//此处没有取a的值???
0x0000000000400be1 : mov $0x400e5d,%esi //
0x0000000000400be6 : mov $0x601300,%edi //压栈esi、edi,装备调用callq
0x0000000000400beb : callq 0x400940 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt>
0x0000000000400bf0 : mov %rax,%rdi
0x0000000000400bf3 : mov $0x400e6c,%esi
0x0000000000400bf8 : callq 0x400940 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt>
0x0000000000400bfd : mov %rax,%rdi
0x0000000000400c00 : mov $0x64,%esi
0x0000000000400c05 : callq 0x4008e0 <_ZNSolsEi@plt>
0x0000000000400c0a : mov %rax,%rdi
0x0000000000400c0d : mov $0x400e79,%esi
0x0000000000400c12 : callq 0x400940 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt>
0x0000000000400c17 : mov %rax,%rdi
0x0000000000400c1a : mov %ebx,%esi
0x0000000000400c1c : callq 0x4008e0 <_ZNSolsEi@plt>
0x0000000000400c21 : mov %rax,%rdi
0x0000000000400c24 : mov $0x4009a0,%esi
0x0000000000400c29 : callq 0x400990 <_ZNSolsEPFRSoS_E@plt>

***********************************test3*********************************************

0x0000000000400c2e : mov $0x400e9c