QA9--

本文深入探讨了C语言中全局变量、局部变量和参数在汇编层面的访问方式,详细解释了inta[100]的不同访问实现。同时,对比了int *p; (p++) 和 (*p)++ 的操作差异,并分析了if分支语句的汇编实现与C条件判断的关系。最后,简要介绍了稀疏switch语句的处理策略。
摘要由CSDN通过智能技术生成

Q&A 9


int a[100]; 在作为全局变量、局部变量、参数时是怎么实现对a[i]元素的访问的?

全局变量:利用%rip+偏移量访问
局部变量:利用%rbp+偏移量访问
参数:先通过%rbp+偏移量得到栈中作为参数传递的a的首地址,然后利用此地址+偏移量访问


int p;(p++)与(*p)++实现有什么不同?

对于*(p++),是取得p+sizeof(int)地址处的值
mov -0x8(%rbp),%rax
add $0x4,%rax
mov %rax,-0x8(%rbp)
对于(*p)++,是将p地址处的值自增1
mov -0x8(%rbp),%rax
mov (%rax),%eax
lea 0x1(%rax),%edx
mov -0x8(%rbp),%rax
mov %edx,(%rax)


if 分支语句的汇编语言实现与C源程序的条件判断之间是 互补 关系。

if(y>100)
0x5555555548c9 mov -0x20(%rbp),%eax
0x5555555548cc cmp $0x64,%eax
0x5555555548cf 77 _ jle 0x5555555548d8 <main+105>
0x5555555548d1 movl $0xffffffff,-0x20(%rbp)


switch多分支,case条件码不规律时是怎么实现的?

稀疏的Switch语句 使用决策树 (if-elseif-elseif-else)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值