一.生成汇编:
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的本质是将从内存中读取数据并修改栈顶指针.

本文介绍了计算机系统的底层运作,包括如何通过gcc和g++生成汇编代码和机器码,以及汇编指令如pushq、popq和ret的功能。讨论了Intel64位处理器的寄存器使用,特别是调用者保存和被调用者保存策略。同时,讲解了栈在数据传输中的作用,强调了C语言指针与内存地址的关系。

2833

被折叠的 条评论
为什么被折叠?



