多模块程序设计与混合编程: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),转载请注明出处。

浙公网安备 33010602011771号