Assembly 如何在汇编(x86)中使用外部函数
我正在研究汇编语言(NASM),目前我正在重写一些函数,例如strlen和strncmp,我正在尝试重做strstrstr 我用C语言制作它是为了看看它是如何工作的,我带来了如下内容:Assembly 如何在汇编(x86)中使用外部函数,assembly,x86,Assembly,X86,我正在研究汇编语言(NASM),目前我正在重写一些函数,例如strlen和strncmp,我正在尝试重做strstrstr 我用C语言制作它是为了看看它是如何工作的,我带来了如下内容: char *my_strstr(char *str, char *match) { int i = -1; int len = strlen(match); while (str[++i] != '\0') if (strncmp((str + i), match
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函数。
在my 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
如何继续使用这些功能
我使用C文件使用的动态库libasm.so(包含这些函数)。标准库已经不存在了,编译绕过了stdlib。我的编译命令是:gccmain.c-Wl,-rpath=-L.-lasm-fno内置
谢谢 对于x86,必须是
\u strlen
(或更好的\u imp\u strlen
)和\u strncmp
(\u imp\u strncmp
)符号。当然,您需要使用这个符号定义的.lib文件。我忘了告诉您我使用的是C文件使用的动态库libasm.so(包含这些函数)。标准库已经不存在了,编译绕过了stdlib。我的编译命令是:gccmain.c-Wl,-rpath=-L.-lasm-fno内置以便在libasm中按名称搜索此函数。因此
-名称必须与strlen和strncmp
在与strstrstr相同的asm文件中定义的名称完全相同?如果没有,您需要告诉NASM这些标签是外部的。如果添加extern strncmp
和extern strlen
,会发生什么情况global
仅导出标签,并且extern
表示某些标签在当前asm文件之外可用。感谢您的回答,strlen、strstrstr和strcmp不是在同一asm文件中实现的。在我的程序集文件(strstrstr.asm)中添加extern关键字(strlen,strncmp)时,出现以下错误:“此处不支持特殊符号功能”。而且,如果我添加extern关键字(\u strlen,\u strncmp),我有以下错误:“symbol…undefined”。对于x86,必须是\u strlen
(或者更好的\u imp\u strlen
)和\u strncmp
(\u imp\u strncmp
)符号。当然,您需要使用这个符号定义的.lib文件。我忘了告诉您我使用的是C文件使用的动态库libasm.so(包含这些函数)。标准库已经不存在了,编译绕过了stdlib。我的编译命令是:gccmain.c-Wl,-rpath=-L.-lasm-fno内置以便在libasm中按名称搜索此函数。因此
-名称必须与strlen和strncmp
在与strstrstr相同的asm文件中定义的名称完全相同?如果没有,您需要告诉NASM这些标签是外部的。如果添加extern strncmp
和extern strlen
,会发生什么情况global
仅导出标签,并且extern
表示某些标签在当前asm文件之外可用。感谢您的回答,strlen、strstrstr和strcmp不是在同一asm文件中实现的。在我的程序集文件(strstrstr.asm)中添加extern关键字(strlen,strncmp)时,出现以下错误:“此处不支持特殊符号功能”。而且,如果我添加extern关键字(_strlen,_strncmp),我会出现以下错误:“symbol…undefined”。