c - 将汇编语言 (x86) 例程与 C 语言连接起来

标签 c assembly x86 tasm

当我尝试从 C 程序调用汇编语言函数 (x86) 时遇到了一些问题。

我的汇编代码如下:

.model small
.code 
.stack 100h
public _putchar
;---------------------
;Putchar proc
;---------------------
    _putchar proc 
        push bp
        mov bp,sp
        mov dl,[bp+4]
        mov ah,2
        int 21h
        pop bp
        ret
    _putchar endp
end

然后,我从 C 中调用这个过程如下:

extern void putchar(char x);

int main(void)
{
    putchar('x');
    return 0;
}

为了编译和链接,我使用以下命令行(按顺序)

tcc -c -ms pchar.c
tasm putchar.asm
tlink pchar putchar, pchar 

到目前为止,我们从 putchar.asm 中获得了 .obj,并通过链接这两个文件获得了 .exe 文件。

我还应该提一下,我们(在类里面)使用 turbo 汇编器版本 2.01 (tasm) 和 turbo link 版本 2.0 (tlink) 以及 Turbo C 版本2.01 (tcc)

问题就在这里,当我运行 .exe 文件时,我得到了应该的输出“x”, 但它卡在那里,它没有结束。

如果有任何帮助,我将不胜感激,在此先感谢。

最佳答案

我观察到的两种可能性是调用例程可能正在使用 AXDX

我严重怀疑这是否有帮助,但请尝试在例行程序之前和之后推送和弹出它们。

通过调试确认或反驳这一点。在调用例程之前放置一个断点,然后越过它(而不是进入它)查看编译器的代码在调用您的 ASM 之后是否要使用 AXDX子程序。

哦,我同意 Alexis Wilke 的意见,更改名称。

关于c - 将汇编语言 (x86) 例程与 C 语言连接起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25943219/

相关文章:

c - C 中的链表丢失头部信息

c - uint32_t 和 size_t 的 printf 格式说明符

c - 米转厘米C语言程序

assembly - .align 在 ARM 架构中有什么作用

assembly - 128位至512位寄存器有什么用?

c++ - 研究简单的代码反汇编输出和内存映射

Linux kernel header.S源码,为什么清零BSS时需要_end+3?

c++ - GCC 可以使用读-修改-写指令来更新 volatile 变量吗?

将特定数据从源缓冲区复制到多个目标缓冲区

c - 从 C 代码调用汇编函数时出现段错误