从汇编语言调用C程序,如何在我的汇编代码中调用C函数

我通常不喜欢发布完整的代码,但是可以尝试一下:

32位汇编

.386

.model flat

.code

_Square proc

mov eax, [esp+4]

imul eax

push eax ; Save the calculated result

; Call PrintResult here

push eax ; value

push 0 ; ShowSquare

call _PrintResult

add esp, 8 ; Clear the stack

pop eax ; Return the calculated result

ret

_Square endp

C

#include

using namespace std;

enum ResultCode {ShowSquare};

enum SuccessCode {Failure, Success};

extern "C" long Square(long);

int main(int argc, char* argv[])

{

long Num1, Num2;

do

{

cout << "Enter number to square" << endl;

cin >> Num1;

Num2 = Square(Num1);

cout << "Square returned: " << Num2 << endl;

}

while (Num2);

return 0;

}

extern "C"

void PrintResult(ResultCode result, long value)

{

switch (result)

{

case ShowSquare:

cout << "Square is: " << value << endl;

break;

default:

cout << "Error calculating square" << endl;

break;

}

}

因为您正在编写C程序,所以默认的调用机制是cdecl,这意味着所有参数都在堆栈上传递,返回值以eax传递,并且调用者随后负责清理堆栈.

因此,为了调用PrintResult,您必须在调用该过程之前将所有参数压入堆栈.在过程返回之后,我们必须清理堆栈(添加esp,8).

因为cdecl调用约定允许在调用过程中修改eax,所以在PrintResult返回时可能不会保留eax,因此我们在调用PrintResult之前保存计算的结果,然后在调用返回后将其恢复.

我没有尝试上面的代码,但是我希望它可以帮助您正确地进行操作.

注意:因为您使用的是C编译器,所以在PrintResult之前需要extern“ C”.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值