预计第三章会在第四次完全结束。
今天先跳过“栈帧结构”一节,因为发现作业题里好多关于“结构体 struct”和联合体“Union”部分的。
昨日循环复习
循环是很重要的一个部分,其已经相对是指令集合的一个使用了。而在这前面基本都是单条指令的学习和运用。
下面来看这样一道题:

和昨日的有异曲同工之妙,但刚好题型是反过来的,我们需要写汇编。
我们一开始让栈指针rsp减了0x10,就是十进制下的16。
其实就是刚好是4个int数据,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

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

被折叠的 条评论
为什么被折叠?



