移位指令实现乘法

include irvine32.inc;
.data
i dword 0;
sum qword 0;
str1 byte "请输入16进制的(32位整数)乘数和被乘数",0
str2 byte "乘积为:",0;
j dword 0;

.code

main proc

L1:
   mov edx,offset str1;
   call writestring;

   mov j,0;
   mov eax,0;eax为(低32位)乘积值;
   mov ebx,0;edx为(低32位)乘积值的中间值
   mov edx,0;
   mov esi,0;dsi为(高32位)乘积值的中间值
   mov edi,0;edi为(高32位)乘积值;
   mov cl,0;cl为移位的位数

   call readhex;
   cmp eax,80000000h;

   jna L4;
   neg eax;
   inc j;
L4:
   mov ebx,eax;    ebx存储乘数(来移位的)
   ;call writeint;

   call readhex;
   cmp eax,80000000h;

   jna L5;
   neg eax;
   inc j;
L5:
   mov i,eax;
   ;call writeint;
   mov eax,0;
   cmp ebx, 0;
   jne L2;
   cmp i,0;
   je  finally;

  L2: cmp ebx,0;
      jz quit;
      shr ebx,1;
      jnc next;if(ZF==0)

      mov esi,0;每次都要清零;
      mov edx,i;

      shld esi,edx,cl;
      shl edx,cl;

      add eax,edx;
      jnc L3;if(ZF==0)
      add edi,1;

 L3:
      add edi,esi;
next:
      inc cl;
      jmp L2;


quit:
     call crlf;
     mov edx,offset str2;
     call writestring;
     mov ebx,eax;

     cmp j,1;
     jne L6;
     add edi,80000000h
     ;call writestring
 L6:

     mov eax,edi;
     call writehex;

     mov eax,ebx;
     call writehex;


     call crlf;

     jmp L1;

finally:

exit
main endp;
end main

转载于:https://www.cnblogs.com/hqu-ye/archive/2013/02/25/2932588.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值