我正在研究汇编语言(NASM),我目前正在重写一些函数,例如strlen和strncmp,我正在尝试重做strstr。
我用C语言做的,看看它是如何工作的,我得到了这样的东西:
char *my_strstr(char *str, char *match)
{
int i = -1;
int len = strlen(match);
while (str[++i] != '\0')
if (strncmp((str + i), match, len) == 0)
return (str + i);
return (NULL);
}
我有strlen NASM函数和strncmp NASM函数。在我的header.asm中,我有:
section .text
global strlen:function
global strcmp:function
global strstr:function
现在是我想调用前面所做的两个函数的文件(也没有检查NULL str),它可能不起作用,但...这不是问题
%include "src/header.asm"
extern strlen
extern strncmp
strstr:
;; bla bla bla
call strlen
mov rdx, rax ; the return value of strlen is in rax right ?
;; bla bla bla
call strncmp ;
cmp rax, 0h ; the return value still is in rax right ?
je bla bla bla
;; bla bla bla
当我编译的时候,我得到了下面的错误:
srcs/strstr.asm:2: error: no special symbol features supported here
srcs/strstr.asm:3: error: no special symbol features supported here
如何继续使用这些功能?
我使用我的动态库libasm.so(包含那些函数),我的C文件使用。标准库不存在了,编译绕过stdlib。我的编译命令是:gcc主文件. c-Wl,-rpath=. -L. -激光-fno-内置
谢谢!
1条答案
按热度按时间z4iuyo4d1#
我的回答可能晚了,但我确实找到了你的帖子,几分钟前我也遇到过同样的问题,你必须在程序集中输入函数是extern的,并且在指定函数是extern的时候在函数的开头加下划线
不幸的是,只有在C++中加入外部“C”时,它才起作用