汇编函数传参异常:矩阵乘法函数无法正确获取传入参数
参数传递错误导致汇编矩阵乘法函数无法正确获取参数
问题概述
实现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
相关产品推荐
相关产品推荐

