You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从汇编向C函数传递数组?段错误问题求助

汇编传递数组给C函数出现段错误的解决方法

核心错误分析

  • 传递数组值而非地址
    原汇编中mov ecx, [array]是读取数组第一个字节的数值(即1),并将这个数值作为指针传给C函数minimo。C代码尝试通过这个非法地址访问内存,直接触发段错误。正确做法是传递数组的内存地址,NASM中直接引用变量名即可获取其地址,应改为mov ecx, array。

  • 数据类型不匹配
    汇编里用db定义的是字节数组,但C函数将其当作int*(32位整数指针)处理。32位系统中int占4字节,array[0]会一次性读取数组开头4个字节(即0x05040302),既不是预期的1,后续循环访问array[i]还会越界访问内存,触发段错误。需将汇编数组改为双字类型(对应C的int):array dd 1, 2, 3, 4, 5。

  • 数组长度的类型扩展问题
    原代码中alen db 5是字节型,直接mov ebx, [alen]会将字节值加载到32位寄存器,若字节值为负数(最高位为1)会触发符号扩展,导致size参数错误。建议用movzx ebx, byte [alen](零扩展)将字节转换为32位无符号整数,或直接把alen定义为双字:alen dd 5。

修正后的汇编代码

%include "io.inc"
extern minimo ;My C function
extern printf

section .data
   array dd 1, 2, 3, 4, 5 ; 改为双字类型,对应C的int
   alen dd 5               ; 改为双字类型,直接传递32位整数
   fmt db "%d", 10, 0      ;Format for the printf function

section .text
global CMAIN
CMAIN:
   xor eax, eax

   mov ebx, [alen]
   mov ecx, array          ; 传递数组地址,而非第一个元素的值
   
   push ebx
   push ecx
   call minimo
   add esp, 8

   push eax
   push fmt
   call printf
   add esp, 8
   
   mov eax, 1
   mov ebx, 0
   int 80h

修正后的C代码(无需修改,若保持数组为字节则需调整类型)

int minimo(int *array, int size){
   int ret = array[0];
   for (int i = 1; i < size; i++){
      if(array[i] < ret){
         ret = array[i];
      }
   }
   return ret;
}

内容的提问来源于stack exchange,提问作者Diego López

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 10:30:51