如何从汇编中调用用 C 编写的代码?
how to call code written in C from assembly?
问题已解决
应该使主符号成为全局符号,以便 linker 在 linking 时可以在目标文件中找到它。更正代码。
在执行任务时,尝试从程序集(YASM 汇编器)调用简单的 C 函数:
编写了 C 函数:
#include <stdio.h>
void
func_in_c(char *s)
{
printf("%s", s);
}
编写调用汇编代码:
segment .data
str_t_c db "Wow", 0
segment .text
global main ; That is the solution - let linker find global symbol
extern printf
extern func_in_c
main:
push rbp
mov rbp, rsp
lea rdi, [str_to_c]
call func_in_c
leave
ret
编译的程序集:
yasm -f elf64 -m amd64 -g dwarf2 main.asm
编译的c代码:
gcc -o main_c.o -c main_c.c
试图link将两个目标文件转换为单个可执行二进制文件:
gcc -o main main_c.o main.o
得到:
...
In function _start:
(.text+0x20): undefined reference to main
...
您对如何更正 commands/code 以构建可执行文件有什么建议吗?
是的,我读过类似的问题(使用 NASM 汇编程序,但没有解决方案)。
您需要先将 main
标签设置为全局标签,否则目标文件将不包含该符号,链接器将无法识别它。
问题已解决 应该使主符号成为全局符号,以便 linker 在 linking 时可以在目标文件中找到它。更正代码。
在执行任务时,尝试从程序集(YASM 汇编器)调用简单的 C 函数:
编写了 C 函数:
#include <stdio.h>
void
func_in_c(char *s)
{
printf("%s", s);
}
编写调用汇编代码:
segment .data
str_t_c db "Wow", 0
segment .text
global main ; That is the solution - let linker find global symbol
extern printf
extern func_in_c
main:
push rbp
mov rbp, rsp
lea rdi, [str_to_c]
call func_in_c
leave
ret
编译的程序集:
yasm -f elf64 -m amd64 -g dwarf2 main.asm
编译的c代码:
gcc -o main_c.o -c main_c.c
试图link将两个目标文件转换为单个可执行二进制文件:
gcc -o main main_c.o main.o
得到:
...
In function _start:
(.text+0x20): undefined reference to main
...
您对如何更正 commands/code 以构建可执行文件有什么建议吗? 是的,我读过类似的问题(使用 NASM 汇编程序,但没有解决方案)。
您需要先将 main
标签设置为全局标签,否则目标文件将不包含该符号,链接器将无法识别它。