如何从Assembly调用C函数?

时间:2014-10-01 08:11:40

标签: c assembly

这是整个装配程序:

.model small
.stack 256

.code
start:
    call printer
    mov ax, 3       ; store 3 into ax

    mov ah, 76      ; back to DOS
    mov al, 0       ; no errors
    int 21h         ; interupt -> DOS
end start

这是我定义C函数printer

的地方
#include <stdio.h>

void printer()
{
    printf("Hello!\n");
}

编译汇编代码时,出现错误:undefined symbol: printer。在C我会做#include "file.h",我如何在此处获得相同的结果?

2 个答案:

答案 0 :(得分:5)

问题不在于编译,而在于链接。您必须链接(在Unix / Linux上使用ld)您的可执行文件,包括带有汇编代码的目标文件和带有C代码的目标文件。

或者使用"asm"块将汇编代码放入C文件中。

答案 1 :(得分:2)

您应该添加类似

的内容
extern  _printer
在程序集顶部

并使用此名称调用

call _printer

正确的函数名称取决于C编译器的命名约定。编译器可能会在函数的C名称中添加一些字符。

正确的“extern”关键字取决于你的汇编程序,它可能是“.extern”左右。

编辑1: 在Turbo汇编程序中,对于没有参数的函数,它应该只是

extrn printer

extrn printer:NEAR

我不熟悉TASM。