c - 从 c 链接并调用汇编函数

标签 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 调用汇编函数,然后打印汇编函数的返回值。

我正在尝试编译并链接这两个文件(使用 paul carters 集中的 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) 参数从堆栈读入 ebx,该函数需要该参数。

2) 在返回之前不要立即用 0 覆盖 EAX。到达 end 的唯一方法是通过 case_onecase_two 以及那些已经设置返回值的方法。

%include "asm_io.inc"

segment .data

segment .bss

segment .text
    global secret_func
secret_func:
    enter 0,0
    push ebx
    mov     ebx, [ebp + 8] ; first argument by gcc x86 calling convention
    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

    leave
    ret

关于c - 从 c 链接并调用汇编函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51902150/

相关文章:

linux - mov byte [esi +9], bl 导致段错误

linux - 无法在我的 Ubuntu 上安装 nasm

linux - 如何为基于文本的内容执行汇编 IO?

C - 函数(假设 a 和 n 是参数,其中 a 是 int 值数组,n 是数组的长度。)

将文件中的字符复制到数组中

c - 赋值中的左值无效

assembly - 尝试在汇编程序中打印变量时 GDB 显示错误消息

c - 在 C 编程中将当前日期和时间转换为 2 个不同的变量

assembly - 链接汇编程序 : error "undefined reference to ` printf'"

c - 汇编代码转C练习