• Assembly:计算a乘b


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

  • 相关阅读:
    TestNG并发测试包
    @Valid的坑
    spring boot 下 spring security 自定义登录配置与form-login属性详解
    在eclipse上搭建springBoot
    分页问题
    谷歌chrome://chrome-urls/
    chrome中清除dns缓存
    pg中的非varchar类型的模糊搜索
    spring中用xml配置构造注入的心得
    Flask-Limiter使用详细说明
  • 原文地址:https://www.cnblogs.com/barrier/p/6675810.html
Copyright © 2020-2023  润新知