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

1yjd4xko  于 2023-03-18  发布在  其他
关注(0)|答案(1)|浏览(185)

我正在研究汇编语言(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-内置
谢谢!

z4iuyo4d

z4iuyo4d1#

我的回答可能晚了,但我确实找到了你的帖子,几分钟前我也遇到过同样的问题,你必须在程序集中输入函数是extern的,并且在指定函数是extern的时候在函数的开头加下划线

extern _vd
section .code
global main
           _main:
           call _vd

不幸的是,只有在C++中加入外部“C”时,它才起作用

#include <stdio.h>
#include <windows.h>

extern "C" void vd()
{
        printf("Hello world");
        ExitProcess(1);
}

相关问题