MST

星途 面试题库

面试题:C与汇编混合编程之基本调用

在C语言与汇编语言混合编程中,假设已有一个汇编函数实现两个整数相加,在C语言中如何正确声明并调用这个汇编函数?请写出大致的C语言代码结构及对应的汇编函数声明约定(以x86架构为例)。
46.7万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

C语言代码结构

// 声明汇编函数,采用cdecl调用约定(x86架构常见约定)
extern int add(int a, int b);

int main() {
    int result = add(3, 5);
    return result;
}

汇编函数声明约定(以MASM语法为例)

.386
.model flat, c
.code

add proc
    push ebp
    mov ebp, esp
    mov eax, [ebp + 8] ; a的值在栈中偏移ebp + 8的位置
    add eax, [ebp + 12] ; b的值在栈中偏移ebp + 12的位置
    pop ebp
    ret
add endp

end

在上述汇编代码中:

  1. .386 声明使用80386指令集。
  2. .model flat, c 声明使用平坦内存模型以及C语言调用约定(cdecl),C语言调用约定下,调用者负责清理栈。
  3. add procadd endp 定义了名为 add 的过程(函数)。
  4. push ebpmov ebp, esp 用于建立栈帧。
  5. 通过栈偏移获取参数 ab 并相加,结果存于 eax 中(x86架构中函数返回值通常存于 eax 寄存器)。
  6. pop ebpret 用于恢复栈帧并返回。