Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 如何在汇编(x86)中使用外部函数_Assembly_X86 - Fatal编程技术网

Assembly 如何在汇编(x86)中使用外部函数

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

我正在研究汇编语言(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, 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”。