移位指令实现乘法
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
總結
- 上一篇: 正则东西类,简化正则匹配
- 下一篇: stringstream精度问题