程序的机器级表示

一.生成汇编:

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

 

 

 

【CSAPP-深入理解计算机系统】3-2.寄存器与数据传送指令_哔哩哔哩_bilibili

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值