%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
我不确定我的错误在哪里,我是否正确理解了汇编程序,或者在链接或编译时是否出错?
答案 0 :(得分:0)
这对我有用。 仅有的两行更改为:
1)将参数从堆栈中读取到ebx中,该函数需要该参数。
2)不要在返回前立即用0覆盖EAX。到达jar
的唯一方法是通过end
或case_one
并且已经设置返回值的那些对象。
case_two