Assembly:计算a乘b
题目描述:若$a=123$,$b=236$,在不使用乘指令的情况下求$a imes b$的值.
由$a imes b=sum_{i=0}^{lfloor log_2b floor}a imes [b&(1<<i)]$,可以以$O(log_2n)$复杂度计算$a imes 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$,见下图.