从 c 链接和调用汇编函数

反驳
%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 的汇编函数,然后打印汇编函数的返回值。

我试图编译和链接这 2 个文件(使用 paul carters set 中的 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_oneorcase_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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从C调用汇编函数

来自分类Dev

从C调用汇编函数

来自分类Dev

如何从C代码调用汇编函数?

来自分类Dev

如何从C代码调用汇编函数?

来自分类Dev

从C ++调用汇编代码

来自分类Dev

C代码调用汇编:无限循环

来自分类Dev

如何在x86体系结构上从C调用汇编函数?

来自分类Dev

链接c和汇编

来自分类Dev

使用Visual Studio从C ++代码调用汇编过程

来自分类Dev

从C调用内联汇编函数

来自分类Dev

从 c 调用的汇编函数被忽略

来自分类Dev

无法在汇编中链接C ++函数

来自分类Dev

汇编x86-调用C函数

来自分类Dev

如何从汇编中调用C函数

来自分类Dev

从调用C代码汇编函数在linux

来自分类Dev

汇编x86-调用C函数

来自分类Dev

汇编和 c - 按引用调用问题

来自分类Dev

使用汇编的C#条件

来自分类Dev

从另一个文件调用汇编函数

来自分类Dev

链接c ++和汇编时出现分段错误

来自分类Dev

汇编器和C代码之间的链接错误(MinGW)

来自分类Dev

MIPS-在汇编代码中调用C函数

来自分类Dev

在Objective C程序(Xcode)中使用汇编代码

来自分类Dev

在Objective C程序(Xcode)中使用汇编代码

来自分类Dev

C#链接参数函数调用

来自分类Dev

是否存在专门设计为使用汇编指令以跨平台方式对位进行编译的C函数或宏,以进行1:1编译?

来自分类Dev

C#和JS函数链接

来自分类Dev

C 裸函数 - 在 1 个函数中执行汇编和 c 代码的灼热解决方案

来自分类Dev

从汇编中调用C printf