多模块程序设计与混合编程:C 语言调用汇编

为什么混合编程?

  • **性能热点**:关键函数用汇编优化
  • **硬件操作**:端口访问、特权指令
  • **学习价值**:查看 C 代码的汇编实现
  • C 调用汇编

    汇编文件(add.asm)

    
    .386
    .MODEL flat, C
    .CODE
    
    ; int add(int a, int b);
    add PROC
        MOV EAX, [ESP+4]    ; 参数 a
        MOV ECX, [ESP+8]    ; 参数 b
        ADD EAX, ECX
        RET
    add ENDP
    
    END
    

    C 文件(main.c)

    
    #include <stdio.h>
    extern int add(int a, int b);
    
    int main() {
        int result = add(100, 200);
        printf("100 + 200 = %d
    ", result);
        return 0;
    }
    

    编译链接

    
    nasm -f win32 add.asm -o add.obj
    gcc -m32 main.c add.obj -o mixed.exe
    

    汇编调用 C 库

    
    EXTERN printf:PROC
    EXTERN exit:PROC
    
    SECTION .data
        msg DB 'Hello from Assembly!', 0
    
    SECTION .text
        GLOBAL main
    main:
        PUSH msg
        CALL printf
        ADD ESP, 4
        PUSH 0
        CALL exit
    

    参数传递约定(32 位)

    1. 参数从右到左压栈

    2. CALL 后栈布局:

    `

    [ESP] = 返回地址

    [ESP+4] = 参数 1

    [ESP+8] = 参数 2

    `

    3. 返回值放在 EAX

    4. 调用者负责清理栈

    64 位差异

    | 32 位 | 64 位 |

    |:--|:--|

    | 栈传参 | RCX/RDX/R8/R9 寄存器传参 |

    | 调用者清栈 | 调用者清栈(影子空间 32 字节)|

    | EAX 返回值 | RAX 返回值 |

    总结

    混合编程让汇编融入现代开发流。掌握链接约定,你就能在需要时引入汇编优化。

    下一篇:《10 个经典汇编程序实例:从排序到字符串处理》


    原文链接:https://wenyiblog.top/2026/06/asm-15-mixed-programming/

    首发于文艺技术笔记(wenyiblog.top),转载请注明出处。

    posted @ 2026-06-22 19:28  软件工程师文艺  阅读(0)  评论(0)    收藏  举报