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$,见下图.

posted @ 2017-04-06 22:38  barriery  阅读(330)  评论(0编辑  收藏  举报