gcd,lcm 汇编版本

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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值