我在 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
(start
和 length
),或 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/