gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:29:23 25 4
gpt4 key购买 nike

%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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com