我试图将汇编函数链接到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位
答案 0 :(得分:1)
问题是:
%ebx
和%edi
-m32
标志)cmpl
操作数被颠倒谢谢大家,问题解决了。 我将更多地关注调试工具(逐步拆卸和运行非常有用)!