如何从汇编向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
相关产品推荐
相关产品推荐

