Assembly:计算a乘b

Assembly:计算a乘b

题目描述:若$a=123$,$b=236$,在不使用乘指令的情况下求$a \times b$的值.

由$a \times b=\sum_{i=0}^{\lfloor log_2b \rfloor}a \times [b\&(1<<i)]$,可以以$O(log_2n)$复杂度计算$a \times b$的值.

c语言描述如下(一般用于非高精度模意义下的乘法,防止直接相乘溢出):

1 int mul(int a,int b){
2     int t=a,r=0;
3     while(b){
4         if(b&1)r+=t;
5         t+=t;
6         b>>=1;
7     }   
8     return r;
9 }

下面介绍几个会用到的汇编指令:

  • JCXZ 该指令为条件跳转指令,当CX寄存器为零时跳转到后面的label处
  • TEST 该指令为逻辑运算指令,对后面两个参数进行位与操作,若值为零则将ZF(zero flag)值为1,常用来奇偶检测
  • JZ 该指令为条件跳转指令(jump zero),当ZF为1时跳转到后面的label处
  • SAR 该指令为算数位移,最高位不变,向右移若干位
  • JMP 该指令为无条件跳转指令,跳转到后面的label处

汇编描述如下:

 1 assume cs: codeseg
 2 
 3 codeseg segment
 4 start:
 5     mov ax,0
 6     mov bx,123
 7     mov cx,236
 8 
 9 LOP:jcxz ED       ;如果cx==0,则跳转到ED
10     test cx,1
11     jz PAS
12     add ax,bx     ;如果cx&1==1,则ax+=bx
13 PAS:add bx,bx
14     sar cx,1      ;cx>>=1
15     jmp LOP
16 
17 ED:               ;ax的值即为bx*cx=123*236
18     mov ax,4c00H
19     int 21H
20 codeseg ends
21 end

 最后得到AX的值为$(29028)D=(7164)H$,见下图.

转载于:https://www.cnblogs.com/barrier/p/6675810.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值