汇编不是孤岛。通过 extern 和 PUBLIC 指令,C 语言可以调用汇编函数,汇编也可以调用 C 库。本文详解混合编程的链接过程、参数传递和实际应用场景。
为什么混合编程?
- 性能热点:关键函数用汇编优化
- 硬件操作:端口访问、特权指令
- 学习价值:查看 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 位)
- 参数从右到左压栈
CALL 后栈布局:1
2
3
| [ESP] = 返回地址
[ESP+4] = 参数 1
[ESP+8] = 参数 2
|
- 返回值放在
EAX - 调用者负责清理栈
64 位差异
| 32 位 | 64 位 |
|---|
| 栈传参 | RCX/RDX/R8/R9 寄存器传参 |
| 调用者清栈 | 调用者清栈(影子空间 32 字节) |
| EAX 返回值 | RAX 返回值 |
总结
混合编程让汇编融入现代开发流。掌握链接约定,你就能在需要时引入汇编优化。
下一篇:《10 个经典汇编程序实例:从排序到字符串处理》