%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_one
或 case_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/