我正在做一个汇编x86程序,解决2x2矩阵的行列式。嗯,我已经在C中完成了驱动程序,然后我做了一个将在汇编x86代码中处理的函数。这是C中的函数:int det(int,int,int,int)attribute(_cdecl);我的问题是:我如何在x86中使用这四个int(我在该函数中作为参数传递)?如何在x86代码中使用它们?我认为它可能与堆栈有关,但我不知道如何。
你基本上是在问:参数位于哪里,对吗?
cdecl
以相反的顺序传递堆栈上的所有参数。查看调用约定的规范。
对于你的函数:
int det(int p1, int p2, int p3, int p4);
你的堆栈看起来像这样在你的函数的开始:
p4
p3
p2
p1
return address
esp
总是指向返回地址。esp+4
指向p1
,esp+8
指向p2
等。
请注意:
当您使用cdecl
调用约定时,必须保留所有寄存器,eax
、ecx
和edx
除外。当执行ret
时,所有其他寄存器必须与进入该函数时相同。
返回值在eax
。
; UNTESTED
; int det(int a11, int a12, int a21, int a22)
_det:
mov ecx, [esp + 4]
mov edx, [esp + 12]
imul ecx, edx
mov eax, [esp + 8]
mov edx, [esp + 16]
imul eax, edx
sub ecx, eax
mov eax, ecx
ret