C 语言指针反汇编代码阅读

本文深入探讨了C语言中的指针概念,并通过实例展示了如何阅读和理解反汇编代码,帮助读者更好地掌握底层内存操作和程序执行流程。
摘要由CSDN通过智能技术生成


rbp:  0x7fffffffdd00

rbp-14: 0x7fffffffdcf2


C语言代码:
	int *p=(int *)0x7fffffffdcf0;



rax(保存了0x7fffffffdcf2): 0x7fffffffdcec  *0x7fffffffdcec=5

0x7fffffffdcec就是rbp -14的值, 0x14
0x7fffffffdcf2是rbp-14   14是10进制


注意: gdb print $rbp-14是10进制, 而汇编代码是0x14
rax:0x7fffffffdcec
rbp - 0x14: 0x7fffffffdcec

rbp -0x10:  0x7fffffffdcf0





C语言代码:
	int *p=(int *)0x7fffffffdcf0;



反汇编代码:
Dump of assembler code for function main:
   0x00000000004004d6 <+0>:	push   %rbp
   0x00000000004004d7 <+1>:	mov    %rsp,%rbp
   0x00000000004004da <+4>:	movabs $0x7fffffffdcf0,%rax
   0x00000000004004e4 <+14>:	mov    %rax,-0x8(%rbp)
=> 0x00000000004004e8 <+18>:	mov    $0x0,%eax
   0x00000000004004ed <+23>:	pop    %rbp
   0x00000000004004ee <+24>:	retq   
End of assembler dump.


(gdb) print /x $rax
$48 = 0x7fffffffdcf0


(gdb) print  $rbp-0x8
$32 = (void *) 0x7fffffffdcf8
问题: 为什么print  $rbp-0x8之后,是0x7fffffffdcf8???
$rax 之类的不是输出寄存器的值么, 为啥不是0x7fffffffdcf0???

(
(gdb) print /x *0x7fffffffdcf8
$46 = 0xffffdcf0    #rbp-0x8只保留了0x7fffffffdcf0的低八位
(gdb) print $rax

为啥只保留了低八位??

再看下一个案例
   0x0000000000400546 <+0>:	push   %rbp
   0x0000000000400547 <+1>:	mov    %rsp,%rbp
   0x000000000040054a <+4>:	sub    $0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值