2017-2018-1 20179202第三周汇编混合编程分析总结

本文探讨了一个简单的C语言求和函数,并尝试使用汇编语言进行优化实现。作者分享了在课堂实践中遇到的问题,包括如何正确地从main函数跳转到汇编写的求和函数以及如何在汇编中实现for循环。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

sum.c 文件为:

#include<stdio.h>
int sum(int N,int arr[])
{
        int s=0;
        int i;
        for(i=0;i<N;i++)
           s+=arr[i];
        return s;
}

用objdump -d sum.o 反汇编 sum.o:

1249675-20171112202914700-1661828516.png

嵌入汇编实现:

1249675-20171112202415231-964665225.png

注:addl %%ecx,%%ebx 实现的是 %%ebx+=%%ecx,即s+=arr[i]

1249675-20171112202404997-516300376.png

上述代码是把输入先放到寄存器中,过程有些复杂,将代码改进如下:

1249675-20171112202405122-1605487356.png

遇到的问题及解决:
课堂上没有做出来是因为题目要求在 main.c 中通过汇编调用 sum,根据之前所学用 int 0x80 实现系统调用,我一直在想怎么用汇编实现跳转 sum,然后我傻到自己修改了 eip 的值:

asm volatile(
        "movl %2,%%ecx\n\t"
        "movl %1,%%ebx\n\t"
        "movl $8b450c,%%eip"\n\t"
        :"=a"(s) 
        :"b"(s),"c"(argc)
        );
    }

下课后杨森同学指出了我的错误,然后我又开始思考如何把 for 循环用汇编实现,很遗憾,此问题没有得到解决。我现在能做的,就是将 s=s+arr[i] 用汇编实现。

如何跳转 sum 函数以及 如何写 for 循环,希望老师能帮忙解决一下。

转载于:https://www.cnblogs.com/Jspo/p/7822914.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值