C语言嵌入AT&T汇编 代码段错误

c98423 2017-11-10 05:02:48
int sum(int N,int arry[]){
int i = 0;
int s = 0;
for(i = 0;i < N;i++)
s += arry[i];
return s;
}
#include <stdio.h>
#include <stdlib.h>
int sum(int N,int arry[]);
int main(int argc,char *argv[]){
int i;
int temarr[argc];
temarr[0] = 0;
for(i = 1;i < argc; i++)
temarr[i] = atoi(argv[i]);
printf("Total is %d \n",sum(argc,temarr));
return 0;
}
这是C语言。现在要求是把main中调用sum()换成内嵌汇编的方式。我做的是直接把sum.o反汇编,直接截取其中的汇编代码,但是报错!Segmentation fault (core dumped)。初步判断是反汇编之后标号和地址没有改变。内嵌汇编如下:
#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]){
int i;
int total = 0;
int temarr[argc];
temarr[0] = 0;
for(i = 1;i < argc; i++)
temarr[i] = atoi(argv[i]);
__asm__ __volatile__ (
"pushq %%rbp;\n\t"
"movq %%rsp,%%rbp;\n\t"
"movl %%edi,-0x14(%%rbp);\n\t"
"movq %%rsi,-0x20(%%rbp);\n\t"
"movl $0x0,-0x8(%%rbp);\n\t"
"movl $0x0,-0x4(%%rbp);\n\t"
"movl $0x0,-0x8(%%rbp);\n\t"
"jmp 7f;\n\t"
"8:\tmovl -0x8(%%rbp),%%eax;\n\t"
"cltq;\n\t"
"leaq 0x0(,%%rax,4),%%rdx;\n\t"
"movq -0x20(%%rbp),%%rax;\n\t"
"addq %%rdx,%%rax;\n\t"
"movl (%%rax),%%eax;\n\t"
"addl %%eax,-0x4(%%rbp);\n\t"
"addl $0x1,-0x8(%%rbp);\n\t"
"7:\tmovl -0x8(%%rbp),%%eax;\n\t"
"cmpl -0x14(%%rbp),%%eax;\n\t"
"jl 8b;\n\t"
"movl -0x4(%%rbp),%%eax;\n\t"
"popq %%rbp;\n\t"
"retq;\n\t"
"nopw %%cs:0x0(%%rax,%%rax,1);\n\t"
"nopl (%%rax);\n\t"
: "=a" (total)
: "b" (argc),"a" (temarr)
: "memory"
);
printf("Total is %d \n",total);
return 0;
}
求大神告知解决办法!!
...全文
641 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复

int sum(int N, int arry[])
{
  __asm__("movl %0,%%ecx       \n\
           movl %1,%%edx       \n\
           xor %%eax,%%eax     \n\
           cmpl $1,%%ecx       \n\
           jl __exit           \n\
         __loop:               \n\
           addl (%%edx),%%eax  \n\
           addl $4,%%edx       \n\
           subl $1,%%ecx       \n\
           jnz __loop          \n\
         __exit:               \n"
           :
           : "m"(N), "m"(arry));
}
这个可以32位、64位通用。
赵4老师 2017-11-10
  • 打赏
  • 举报
回复
搜“堆栈平衡” 调用约定 https://msdn.microsoft.com/zh-cn/magazine/9b372w95.aspx http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素
赵4老师 2017-11-10
  • 打赏
  • 举报
回复
Windows: 崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。 Linux: 进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈,内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件,参考“ulimit -c core文件最大块大小”命令

21,453

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧