Gcc 在c中使用内联汇编检查32位整数数组中的最大值

Gcc 在c中使用内联汇编检查32位整数数组中的最大值,gcc,assembly,x86,inline-assembly,Gcc,Assembly,X86,Inline Assembly,我正在尝试使用c中的内联汇编查找整数数组中的最大元素。下面是我尝试的解决方案,并附上说明我的逻辑的注释 我的尝试: 静态内联int max_elem() { int list[]={1,8,6,2,3}; 最高温度; 整数长度=5; 挥发性物质( /*初始化最大值*/ 初始化:移动(%1),%0 “jmp启动; /*增量arr指向内存中的下一个int(4字节)*/ 开始:添加$4,%1 /*检查是否在所有元素中循环*/ “低于$1,%3;” “cmp$0,%3;” “我做完了 /*将最大值与列表

我正在尝试使用c中的内联汇编查找整数数组中的最大元素。下面是我尝试的解决方案,并附上说明我的逻辑的注释

我的尝试:

静态内联int max_elem()
{
int list[]={1,8,6,2,3};
最高温度;
整数长度=5;
挥发性物质(
/*初始化最大值*/
初始化:移动(%1),%0
“jmp启动;
/*增量arr指向内存中的下一个int(4字节)*/
开始:添加$4,%1
/*检查是否在所有元素中循环*/
“低于$1,%3;”
“cmp$0,%3;”
“我做完了
/*将最大值与列表中的当前元素进行比较*/
mov(%1),%2
cmp%2,%0
“jl new_max;”
新的最大值:mov%2,%0
“jmp启动;”
“完成:;”
:“=a”(max)/*将max分配给传统返回寄存器*/
:“r”(列表)、“r”(临时)、“r”(长度)/*编译器选择输入变量的赋值*/
);
}

尽管我的逻辑似乎正确,但我尝试的解决方案似乎给了我一个分段错误。任何其他帮助或输入都将不胜感激!

哪个处理器、编译器和宿主环境?为此使用内联asm不是一个好主意。您是被迫这样做的吗(例如,作为作业的一部分?)无论如何,请检查生成的程序集并使用调试器。快速浏览一下,您的问题可能是您忘记将输出指定为早期clobber。除非另有说明,否则编译器可能会分配与输入重叠的输出。PS:您的代码已断开,
jl new_max
应该是
jge start
,无论哪种方式,您都陷入了
new_max
的困境。感谢您的快速响应,现在一切正常。主要问题是我没有指定早期缓冲寄存器。当在使用所有输入寄存器之前使用输出寄存器时,我是否应该将输出寄存器声明为早期缓冲寄存器?另一个问题是您正在修改输入操作数%1和%2,而不告诉编译器。如果您试图学习汇编,我强烈建议您创建一个汇编文件,而不是使用内联汇编。您需要在汇编代码之后添加
return max
,以便编译器可以看到max\elem返回的内容。只需将其放入eax即可不足,尤其是当函数正在内联时。