format coff
macro Obj Proc,nArg
{
if ~ nArg eq
public Proc as "_" # `Proc # "@" # `nArg
display "public: _" # `Proc # "@" # `nArg,0ah
else
public Proc as "_" # `Proc
display "public: _" # `Proc,0ah
end if
Proc:
}
macro CCall Proc,[Args]
{
common
size@ccall = 0
if ~ arg eq
reverse
pushd Args
size@ccall = size@ccall+4
common
end if
call Proc
if size@ccall
add esp,size@ccall
end if
}
macro SCall Proc,[Args]
{
common
if ~ arg eq
reverse
pushd Args
common
end if
call Proc
}
macro Push [Arg]
{
pushd Arg
}
macro Pop [Arg]
{
popd Arg
}
Obj gcd,8
Push ecx,edx
mov eax,[esp+4+8] ;eax=参数1
mov ecx,[esp+8+8] ;ecx=参数2
cmp eax,ecx ;
jae @f ;如果 eax<ecx
xchg eax,ecx ;交换 eax,ecx
@@:
jecxz .ok ;如果 ecx=0,退出
@@:
xor edx,edx
div ecx ;edx:eax/ecx
mov eax,ecx ;ecx作被除数
test edx,edx ;检查余数
mov ecx,edx ;余数作除数
jnz @b ;余数!=0,循环
.ok:
Pop edx,ecx
ret 8
Obj lcm,8
push ecx
SCall gcd,[esp+8+8],[esp+4+4]
mov ecx,eax ;将最大公约数存入ecx
jecxz @f
mov eax,[esp+4+4]
mul dword [esp+8+4]
div ecx ;Arg1*Arg2/ecx
@@:
pop ecx
ret 8
在 Visual C++ 中,按照如下声明函数原型:
extern "C"
{
dword __stdcall gcd(dword a, dword b);
dword __stdcall lcm(dword a, dword b);
}