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

汇编函数传参异常:矩阵乘法函数无法正确获取传入参数

参数传递错误导致汇编矩阵乘法函数无法正确获取参数

问题概述

实现x86汇编矩阵乘法函数时,函数无法正确读取传入的4个参数(矩阵1地址、矩阵2地址、结果矩阵地址、矩阵大小),调试发现寄存器%edi、%esi、%ebx、%ecx中的值均不符合预期。

现有代码

矩阵乘法汇编函数

matrix_mult:
pushl %ebp
pushl %ebx
pushl %edi
pushl %esi
movl %esp, %ebp

movl 8(%ebp), %edi
movl 12(%ebp), %esi
movl 16(%ebp), %ebx
movl 20(%ebp), %ecx

*其余算法代码*

主函数调用代码

main:
*读取msize和matrix的代码*

pushl msize
pushl $matrix2
pushl $matrix
pushl $matrix
call matrix_mult
addl $16, %esp

调试结果

  • %edi = 2
  • %esi = 大负值
  • %ebx = 大正值
  • %ecx = 大正值

问题原因与修复方案

1. 栈帧建立顺序错误

x86汇编标准栈帧的建立流程应为:先保存旧%ebp,再将当前栈指针%esp赋值给%ebp,最后保存需要保留的寄存器(%ebx、%edi、%esi)。你的代码颠倒了设置%ebp和保存寄存器的顺序,导致%ebp指向了错误的栈位置,无法正确计算参数偏移。

2. 参数偏移计算错误

由于栈帧建立顺序错误,你使用的8(%ebp)、12(%ebp)等偏移量,实际读取的是你自己压栈的寄存器值(%edi、%ebx等),而非传入的函数参数。

修复后的函数代码

matrix_mult:
pushl %ebp          ; 保存旧的ebp寄存器
movl %esp, %ebp     ; 建立新栈帧,让ebp指向旧ebp的位置
pushl %ebx          ; 保存需要保留的寄存器(ebx、edi、esi属于被调用者保存寄存器)
pushl %edi
pushl %esi

; 正确读取参数(对应入栈顺序:mat1 → mat2 → res → size)
movl 8(%ebp), %edi   ; 第一个参数:矩阵1的地址
movl 12(%ebp), %esi  ; 第二个参数:矩阵2的地址
movl 16(%ebp), %ebx  ; 第三个参数:结果矩阵的地址
movl 20(%ebp), %ecx  ; 第四个参数:矩阵大小

*其余算法代码*

; 函数结尾恢复寄存器并销毁栈帧
popl %esi
popl %edi
popl %ebx
movl %ebp, %esp
popl %ebp
ret

验证参数入栈顺序

你的调用代码参数入栈顺序是正确的(符合cdecl调用约定的从右到左压栈规则):先压入最右侧的参数msize,再依次压入matrix2、matrix、matrix,对应函数参数列表(mat1, mat2, res, size)的顺序。

内容的提问来源于stack exchange,提问作者Iustin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 21:50:35