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

汇编不是孤岛。通过 extern 和 PUBLIC 指令,C 语言可以调用汇编函数,汇编也可以调用 C 库。本文详解混合编程的链接过程、参数传递和实际应用场景。

2

为什么混合编程?

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

C 调用汇编

汇编文件(add.asm)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
.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)

1
2
3
4
5
6
7
8
9
#include <stdio.h>
extern int add(int a, int b);

int main() {
    int result = add(100, 200);
    printf("100 + 200 = %d
", result);
    return 0;
}

编译链接

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

汇编调用 C 库

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
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 后栈布局:
    1
    2
    3
    
    [ESP]    = 返回地址
    [ESP+4]  = 参数 1
    [ESP+8]  = 参数 2
    
  3. 返回值放在 EAX
  4. 调用者负责清理栈

64 位差异

32 位 64 位
栈传参 RCX/RDX/R8/R9 寄存器传参
调用者清栈 调用者清栈(影子空间 32 字节)
EAX 返回值 RAX 返回值

总结

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

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

广告
广告位预留中 (728x90)