c - 如何调用 C extern 函数并获取返回结构?

标签 c windows call nasm extern

我在 token.c 中定义了一个 extern 函数和一个 struct:

#include "stdio.h"

typedef struct token {
    int start;
    int length;
} t;

extern t get_token(int, int);

t get_token(int s, int l) {
    printf("[C] new token: start [%d]  length [%d]\n\n", s, l);

    t m_T = {};
    m_T.start = s;
    m_T.length = l;

    return m_T;
}

... 这样我就可以从程序集中调用 _get_token 并获取新 token 。在 make_token.asm 我有以下内容:

SECTION .data       ; initialized data
    mtkn:       db  "call: token(%d, %d)", 10, 0
    mlen        db  "length: %d", 10, 0
    mstt:       db  "start: %d", 10, 0

    mend:       db  10, "*** END ***", 10, 0

SECTION .text       ; code
    extern _get_token

    extern _printf

    global _main

    _main:
        ;   stash base stack pointer
        push    ebp
        mov     ebp,        esp

        mov     eax,        5
        mov     ebx,        10
        push    ebx                     ; length
        push    eax                     ; start
        call    _get_token              ; get a token
        mov     [tkn],      eax

        add     esp,        8

        ;   test token properties
        push    DWORD [tkn]
        push    mstt
        call    _printf

        push    DWORD [tkn + 4]
        push    mlen
        call    _printf

        add     esp,        16

        .end:
        push    DWORD   mend
        call    _printf
        ;   restore base stack pointer
        mov     esp,        ebp
        pop     ebp

SECTION .bss        ; uninitialized data
    tkn:        resd        1

输出是:

[C] new token: start [5] length [10]

start: 5
length: 0

我缺少什么来获得开始和长度?输出验证 C 中的 extern 函数被调用并且值被推送到函数中。

最佳答案

我认为问题出在您的 .bss 部分:

SECTION .bss        ; uninitialized data
    tkn:        resd        1

在这里,您为 token 预留了一个dword(一个整数的内存)内存。但是,在您的 C 代码中,您将 token 结构定义为具有 2 个 int(startlength),或 2 个 dword 的内存值(value)。这意味着您只能写入 token 结构的一部分 (start),并且成员 length 被视为不存在。您的问题可能可以通过简单地将 tkn 定义为

来解决
    tkn:        resd        2

    tkn:        resq        1     ;; 1 QWORD == 2 DWORDs

希望这有帮助;)

关于c - 如何调用 C extern 函数并获取返回结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29810704/

相关文章:

c# - 在 Windows 窗体 (C#) 中使用一个声明设置多个属性

windows - 无法在 Visual Studio 2017 : "Access is denied." 下使用或不使用调试器运行 CMake 可执行文件

javascript - 将 javascript 插入多个现有页面的最佳选择

c - 矩阵作为二维指针 C

c - `configure.ac` 文件给出错误

c++ - CEdit不显示特殊字符

javascript - 无法从 JavaScript 调用 Delphi ActiveX 方法

java - 如何在 Calendar Api 中禁用 Google 的 “Video Call” 默认值?

c - 为什么 getline 在 C 函数中失败?

c - 程序突然终止时套接字保持事件状态