从C代码调用汇编函数时出现分段错误

时间:2016-06-07 13:58:06

标签: c assembly x86

我试图将汇编函数链接到C代码进行练习。 这是我的汇编函数,用x86汇编编写:

.code32

.section .text
.globl max_function
.type max_function, @function 
# i parametri saranno in ordine inverso a partire da 8(%ebp)

max_function:
    pushl %ebp              # save ebp
    movl %esp, %ebp         # new frame function
    movl $0, %edi           # first index is 0
    movl 8(%ebp), %ecx      # ecx is loaded with the number of elements
    cmpl $0, %ecx            # check that the number of elements is not 0
    je end_function_err    #if it is, exit

    movl 12(%ebp),%edx      # edx is loaded with the array base
    movl (%edx), %eax       # first element of the array

    start_loop:
    incl %edi               #increment the index
    cmpl %edi,%ecx          #if it's at the end quit
    je loop_exit
    movl (%edx,%edi,4),%ebx   #pick the value
    cmpl %ebx,%eax              #compare with actual maximum value
    jle start_loop              #less equal -> repeat loop
    movl %ebx,%eax              #greater -> update value
    jmp start_loop              #repeat loop

    loop_exit:
    jmp end_function            #finish

end_function:                   #exit operations
    movl %ebp, %esp
    popl %ebp
    ret

end_function_err:
    movl $0xffffffff, %eax            #return -1 and quit
    jmp end_function

它基本上定义了一个函数,它找到一个数组的最大数量(或它应该是)

我的C代码:

#include <stdio.h>
#include <stdlib.h>

extern int max_function(int size, int* values);

int main(){
    int values[] = { 4 , 5 , 7 , 3 , 2 , 8 , 5 , 6 } ;
    printf("\nMax value is: %d\n",max_function(8,values));
}

我用gcc -o max max.s max.c编译它们 我在执行代码时得到SegmentationFault
我怀疑是我没有以正确的方式访问该值,但我无法理解为什么,即使我将代码基于打印argc和{{1}的示例代码从命令行调用时的值。

我正在运行Debian 8 64位

1 个答案:

答案 0 :(得分:1)

问题是:

  • 未保留%ebx%edi
  • 不编译32位(必须使用gcc的-m32标志)
  • cmpl操作数被颠倒

谢谢大家,问题解决了。 我将更多地关注调试工具(逐步拆卸和运行非常有用)!