一.生成汇编:
1)对于c gcc -S mstore.c
2)对于cpp: g++ -S mstore.cpp
pushq: 将寄存器rbx的值压入程序栈进行保存
movq:寄存器rbx的值与rdx的值一致,都是dest指针所指向的内存地址
popq:在函数返回前,恢复rbx的内容
ret:函数返回
intel64位处理器包含16个通用目的的寄存器,这些寄存器用来存放整数数据和指针.如图下
调用者保存寄存器和被调用者保存寄存器,例如函数A调用函数B,B中rbx寄存器被修改,此时有两个策略;
1)调用者保存策略
函数A在调用函数B之前提前保存rbx的值,执行完以后在恢复rbx的内容.
2)被调用者保存策略
函数B使用rbx之前,先保存rbx的值,使用完以后在恢复.
二.生成机器码
1)对于c
gcc -c store.c
2)对于cpp
g++ -c store.cpp
反汇编查看
objdump -d store.o
三.不同寄存器用法
寄存器就是CPU内的一种数据存储部件,只不过容量比较小
大多数指令包含两部分,操作码和操作数(一个或多个)
内存引用:
四.栈与数据传输指令
不同数据类型,用同一寄存器的不同数位操作.
由此可见,C语言的指针其实就是内存地址.
pushq和popq指令需要借助程序栈 ,程序栈本质是一个内存区域
栈的增长方向是高地址到低地址,所以栈顶元素是所有元素中地址最低的.
pushq指令等效于subq和movq,本质是将数据写入到内存中,pop的本质是将从内存中读取数据并修改栈顶指针.