栈是什么?
栈是硬件,一种数据结构,FIFO,push,pop;
栈底固定,栈顶浮动,栈顶由高地址位向低地址位移动;
栈保存的信息有哪些?
函数的返回地址和参数; 临时变量
堆是什么?
堆内存由malloc()、realloc()函数分配,free()函数释放;
尝试用栈在不传递参数的情况下,用print()函数打印main()函数中的arr数组中的各个元素
#include <stdio.h>
void print() {
/*
unsigned int %rbp;
__asm{
movq %rsp, %rbp
}
*/
}
int main(int argc, const char * argv[]) {
int a = 1;
int b = 2;
char c = 'c';
int arr[] = {11, 12, 13, 14, 15, 16,17};
print();
return 0;
}
分别添加代码,试图学习汇编,未果
void main()
{
return;//breakpoint
}
0x100000fb0 <+0>: pushq %rbp
0x100000fb1 <+1>: movq %rsp, %rbp
-> 0x100000fb4 <+4>: popq %rbp
0x100000fb5 <+5>: retq
int main()
{
return 0;//breakpoint
}
0x100000fa0 <+0>: pushq %rbp
0x100000fa1 <+1>: movq %rsp, %rbp
0x100000fa4 <+4>: xorl %eax, %eax
0x100000fa6 <+6>: movl $0x0, -0x4(%rbp)
-> 0x100000fad <+13>: popq %rbp
0x100000fae <+14>: retq
int main(int argc)
{
return 0;//breakpoint
}
0x100000fa0 <+0>: pushq %rbp
0x100000fa1 <+1>: movq %rsp, %rbp
0x100000fa4 <+4>: xorl %eax, %eax
0x100000fa6 <+6>: movl $0x0, -0x4(%rbp)
0x100000fad <+13>: movl %edi, -0x8(%rbp)
-> 0x100000fb0 <+16>: popq %rbp
0x100000fb1 <+17>: retq
int main(int argc, const char * argv[]) {
return 0; //breakpoint
}
0x100000fa0 <+0>: pushq %rbp
0x100000fa1 <+1>: movq %rsp, %rbp
0x100000fa4 <+4>: xorl %eax, %eax
0x100000fa6 <+6>: movl $0x0, -0x4(%rbp)
0x100000fad <+13>: movl %edi, -0x8(%rbp)
0x100000fb0 <+16>: movq %rsi, -0x10(%rbp)
-> 0x100000fb4 <+20>: popq %rbp
0x100000fb5 <+21>: retq
int main(int argc, const char * argv[]) {
int a = 10;
return 0; //breakpoint
}
0x100000f90 <+0>: pushq %rbp
0x100000f91 <+1>: movq %rsp, %rbp
0x100000f94 <+4>: xorl %eax, %eax
0x100000f96 <+6>: movl $0x0, -0x4(%rbp)
0x100000f9d <+13>: movl %edi, -0x8(%rbp)
0x100000fa0 <+16>: movq %rsi, -0x10(%rbp)
0x100000fa4 <+20>: movl $0xa, -0x14(%rbp)
-> 0x100000fab <+27>: popq %rbp
0x100000fac <+28>: retq
int main(int argc, const char * argv[]) {
print(); //breakpoint
return 0;
}
0x100000f90 <+0>: pushq %rbp
0x100000f91 <+1>: movq %rsp, %rbp
0x100000f94 <+4>: subq $0x10, %rsp
0x100000f98 <+8>: movl $0x0, -0x4(%rbp)
0x100000f9f <+15>: movl %edi, -0x8(%rbp)
0x100000fa2 <+18>: movq %rsi, -0x10(%rbp)
0x100000fa6 <+22>: callq 0x100000f80 ; print at main.c:11
0x100000fab <+27>: xorl %eax, %eax
-> 0x100000fad <+29>: addq $0x10, %rsp
0x100000fb1 <+33>: popq %rbp
0x100000fb2 <+34>: retq
//int a = 1;
//int b = 2;
//char c = 'c';
//int arr[] = {11, 12, 13, 14, 15, 16,17};
0x100000f90 <+0>: pushq %rbp
0x100000f91 <+1>: movq %rsp, %rbp
0x100000f94 <+4>: subq $0x10, %rsp
0x100000f98 <+8>: movl $0x0, -0x4(%rbp)
0x100000f9f <+15>: movl %edi, -0x8(%rbp)
0x100000fa2 <+18>: movq %rsi, -0x10(%rbp)
-> 0x100000fa6 <+22>: callq 0x100000f80 ; print at main.c:11
0x100000fab <+27>: xorl %eax, %eax
0x100000fad <+29>: addq $0x10, %rsp
0x100000fb1 <+33>: popq %rbp
0x100000fb2 <+34>: retq
int a = 1;
//int b = 2;
//char c = 'c';
//int arr[] = {11, 12, 13, 14, 15, 16,17};
0x100000f80 <+0>: pushq %rbp
0x100000f81 <+1>: movq %rsp, %rbp
0x100000f84 <+4>: subq $0x20, %rsp
0x100000f88 <+8>: movl $0x0, -0x4(%rbp)
0x100000f8f <+15>: movl %edi, -0x8(%rbp)
0x100000f92 <+18>: movq %rsi, -0x10(%rbp)
0x100000f96 <+22>: movl $0x1, -0x14(%rbp)
-> 0x100000f9d <+29>: callq 0x100000f70 ; print at main.c:11
0x100000fa2 <+34>: xorl %eax, %eax
0x100000fa4 <+36>: addq $0x20, %rsp
0x100000fa8 <+40>: popq %rbp
0x100000fa9 <+41>: retq
int a = 1;
int b = 2;
//char c = 'c';
//int arr[] = {11, 12, 13, 14, 15, 16,17};
0x100000f80 <+0>: pushq %rbp
0x100000f81 <+1>: movq %rsp, %rbp
0x100000f84 <+4>: subq $0x20, %rsp
0x100000f88 <+8>: movl $0x0, -0x4(%rbp)
0x100000f8f <+15>: movl %edi, -0x8(%rbp)
0x100000f92 <+18>: movq %rsi, -0x10(%rbp)
0x100000f96 <+22>: movl $0x1, -0x14(%rbp)
0x100000f9d <+29>: movl $0x2, -0x18(%rbp)
-> 0x100000fa4 <+36>: callq 0x100000f70 ; print at main.c:11
0x100000fa9 <+41>: xorl %eax, %eax
0x100000fab <+43>: addq $0x20, %rsp
0x100000faf <+47>: popq %rbp
0x100000fb0 <+48>: retq
int a = 1;
int b = 2;
char c = 'c';
//int arr[] = {11, 12, 13, 14, 15, 16,17};
0x100000f80 <+0>: pushq %rbp
0x100000f81 <+1>: movq %rsp, %rbp
0x100000f84 <+4>: subq $0x20, %rsp
0x100000f88 <+8>: movl $0x0, -0x4(%rbp)
0x100000f8f <+15>: movl %edi, -0x8(%rbp)
0x100000f92 <+18>: movq %rsi, -0x10(%rbp)
0x100000f96 <+22>: movl $0x1, -0x14(%rbp)
0x100000f9d <+29>: movl $0x2, -0x18(%rbp)
0x100000fa4 <+36>: movb $0x63, -0x19(%rbp)
-> 0x100000fa8 <+40>: callq 0x100000f70 ; print at main.c:11
0x100000fad <+45>: xorl %eax, %eax
0x100000faf <+47>: addq $0x20, %rsp
0x100000fb3 <+51>: popq %rbp
0x100000fb4 <+52>: retq
int a = 1;
int b = 2;
char c = 'c';
int arr[] = {11, 12, 13, 14, 15, 16,17};
0x100000ee0 <+0>: pushq %rbp
0x100000ee1 <+1>: movq %rsp, %rbp
0x100000ee4 <+4>: subq $0x50, %rsp
0x100000ee8 <+8>: movq 0x111(%rip), %rax ; (void *)0x00007fff94177d40: __stack_chk_guard
0x100000eef <+15>: movq (%rax), %rax
0x100000ef2 <+18>: movq %rax, -0x8(%rbp)
0x100000ef6 <+22>: movl $0x0, -0x34(%rbp)
0x100000efd <+29>: movl %edi, -0x38(%rbp)
0x100000f00 <+32>: movq %rsi, -0x40(%rbp)
0x100000f04 <+36>: movl $0x1, -0x44(%rbp)
0x100000f0b <+43>: movl $0x2, -0x48(%rbp)
0x100000f12 <+50>: movb $0x63, -0x49(%rbp)
0x100000f16 <+54>: movq 0x73(%rip), %rax
0x100000f1d <+61>: movq %rax, -0x30(%rbp)
0x100000f21 <+65>: movq 0x70(%rip), %rax
0x100000f28 <+72>: movq %rax, -0x28(%rbp)
0x100000f2c <+76>: movq 0x6d(%rip), %rax
0x100000f33 <+83>: movq %rax, -0x20(%rbp)
0x100000f37 <+87>: movl 0x6b(%rip), %ecx
0x100000f3d <+93>: movl %ecx, -0x18(%rbp)
-> 0x100000f40 <+96>: callq 0x100000ed0 ; print at main.c:11
0x100000f45 <+101>: movq 0xb4(%rip), %rax ; (void *)0x00007fff94177d40: __stack_chk_guard
0x100000f4c <+108>: movq (%rax), %rax
0x100000f4f <+111>: movq -0x8(%rbp), %rdx
0x100000f53 <+115>: cmpq %rdx, %rax
0x100000f56 <+118>: jne 0x100000f64 ; <+132> at main.c
0x100000f5c <+124>: xorl %eax, %eax
0x100000f5e <+126>: addq $0x50, %rsp
0x100000f62 <+130>: popq %rbp
0x100000f63 <+131>: retq
0x100000f64 <+132>: callq 0x100000f6c ; symbol stub for: __stack_chk_fail
0x100000f69 <+137>: ud2
网友评论