如何处理从C到x86汇编的参数



我正在做一个汇编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调用约定时,必须保留所有寄存器,eaxecxedx除外。当执行ret时,所有其他寄存器必须与进入该函数时相同。

返回值在eax

下面是一个使用NASM语法的示例。请注意,我没有为该函数包含堆栈框架,因为它是一个短叶函数,所以它是一个浪费:
; 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

最新更新