从c链接并调用汇编函数

时间:2018-08-17 20:00:43

标签: c assembly nasm

%include "asm_io.inc"

segment .data

segment .bss

segment .text
    global secret_func
secret_func:
    enter 0,0
    push ebx

    cmp     ebx, 1
    jne     while_init
    jmp     case_one

while_init:
    mov     ecx, 2          

while:
    cmp     ecx, ebx 
    jge     case_two           

    xor     edx, edx        
    mov     eax, ebx        
    div     ecx             

    cmp     edx, 0          
    je      case_one

    add     ecx, 1
    jmp     while  

case_one:
    mov     eax, 0
    jmp     end

case_two:
    mov     eax, 1

end:
    mov ebx, eax
    pop ebx
    mov eax,0
    leave
    ret

给出了上述secret.asm,据我了解,它检查给定的int值是否为质数。还是?

#include <stdio.h>

extern int secret_func (int);


int main()
{
    int ret_status;
    ret_status = secret_func(3);
    printf("%i\n",ret_status);
    return 0;
}

和上面的main.c,应该使用值3调用汇编函数,然后打印汇编函数返回值。

im试图编译并链接这2个文件(使用保罗·卡特集的asm_io):

nasm -f elf -o secret.o secret.asm
nasm -f elf -d ELF_TYPE -o asm_io.o asm_io.asm 
gcc -m32 -c -o main.o main.c -std=c99 -Wall
gcc -m32 -o secret -std=c99 -Wall main.o secret.o asm_io.o

我不确定我的错误在哪里,我是否正确理解了汇编程序,或者在链接或编译时是否出错?

1 个答案:

答案 0 :(得分:0)

这对我有用。 仅有的两行更改为:

1)将参数从堆栈中读取到ebx中,该函数需要该参数。

2)不要在返回前立即用0覆盖EAX。到达jar的唯一方法是通过endcase_one并且已经设置返回值的那些对象。

case_two