CSAPP-Revision-ch03(三)

本文深入探讨了汇编语言中的栈帧结构、控制流程、数组访问及结构体等概念,并详细解析了联合体的内存布局及其应用。通过具体示例介绍了如何在汇编语言中实现C语言中的结构体和联合体特性。

预计第三章会在第四次完全结束。
今天先跳过“栈帧结构”一节,因为发现作业题里好多关于“结构体 struct”和联合体“Union”部分的。

昨日循环复习

循环是很重要的一个部分,其已经相对是指令集合的一个使用了。而在这前面基本都是单条指令的学习和运用。
下面来看这样一道题:

在这里插入图片描述
和昨日的有异曲同工之妙,但刚好题型是反过来的,我们需要写汇编。

我们一开始让栈指针rsp减了0x10,就是十进制下的16。
其实就是刚好是4int数据,4 × sizeof(int) = 4 * 4 = 16
所以接下来就是连续的四条指令。
把2放到%rsp
0放到%rsp + 4
1放到%rsp + 8
9放到%rsp + 12
据此可以完成前面的填空

接着继续往下看

从jl指令可以看出前边应该是一条比较的指令,那么一定是i < 4的汇编
再又有,%rdi就是存储sum指针的寄存器,要对应其内存取值才是*sum的值。
将%ecx拿来加说明了%ecx应该是拿来存放a[i]的。
我们可以那eax来当做i循环变量处理。

因此中间三条要做的操作就是,将当前arr[i]数转移到%ecx中,执行i++的操作,然后另i和4做一次比较
那么最后呢?
最后我们需要释放栈空间,只要让栈指针加回0x10就可以啦。
我的答案如下:

func: 
subq	  $0x10, %rsp					#   为arr数组开辟空间                 
movl	  $0x09, 12(%rsp)				#                              
movl   $0x1,  8
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值