从汇编代码理解C中的指针

如题

& * 在C语言是很常见的,而且我们大家都知道指针的重要性,对于初学者在理解指针,估计 还会头疼一阵。那么从汇编语言 会不会 降低我们的学习曲线呢?答案是 会,而且理解深刻。

首先 理解几个计算机的几个概念。
指令1. + A1 ,A2
1.寄存器,指令1利用cpu 做运算,需要将 A1,A2 分别加载到寄存器中。这里暂用寄存器 %rax,%rcx 来代表 A1,A2 存储的地方。
汇编指令 ADD %rax , %rcx 的 含义 就是 %rcx =%rax +%rcx。

2.汇编中的 间接取值
假设 指令1的结果 A3,我们需要在内存 存一份。存放地址是 0x2401,
指令2 push %rdx // 首先将存放地址 存放在 寄存器%rdx ,
指令3 mov %rcx ,(%rdx) // 将A3 的值存放在 内存 0x2401 中

这里的 指令3 就意味着 *node= A3,node指向的地址0x2401 的值是A3.

3 从汇编语言理解指令的好处
指令4 leaq 3(%rdx), %rax
// %rax=%rdx+3= 0x2401+0x0003=0x2404 不做间接寻址,直接获取地址。
从这里 可以看到 指令leaq 的好处,可以得到 指针指向的地址 也就是& node。

其实 汇编是不区别 指针的。leaq 的指令就是这样,指令的定义 也是 语言发明者给予的定义。

好处:获得指针地址 的好处,扩展到 数值 这种结构就很好说明。如果 cpu 需要操作数组 ,是将整个数组 加载到 寄存器呢,还是 获取数组的0下标的指针,需要 操作数组的 哪个值,只需要移动指针即可,也就是 leaq 指令就可以。

寄存器的存储大小 可是很珍贵的。这也许就是 指针的好处和便利。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值