汇编语言功能用循环累加实现乘法

下面是详细讲解“汇编语言功能用循环累加实现乘法”的完整攻略。

总体思路

实现乘法的其中一种方法是使用循环累加的方式,即从乘数中取出一位,乘以被乘数的每一位,并将每个部分的乘积相加。这个过程需要使用循环、条件判断和累加等操作,其核心就是根据乘数每一位的具体数值来确定需要累加多少次被乘数,最终得出乘积。

示例1

假设我们要实现 5 x 3,则:

  1. 取出 5 的最后一位数 5,即 0101B,转为十进制即 5。
  2. 将被乘数的每一位分别与 5 相乘,规则是在第 $i$ 位乘上 $2^{i-1}$。
    • 对于第 0 位(最低位),倍数是 1,即乘数本身;
    • 对于第 1 位,倍数是 2,即乘数左移 1 位;
    • 对于第 2 位,倍数是 4,即乘数左移 2 位;
    • 对于第 3 位,倍数是 8,即乘数左移 3 位;
  3. 累加每次乘积的结果,得到最终乘积。

因此,我们可以得到下面的汇编代码:

MOV AX, 0003H ; 将被乘数赋值为 3
MOV CX, 0005H ; 将乘数赋值为 5
MOV BX, 0000H ; 用 BX 寄存器存储累积结果

; 开始循环
LOOP_START:
    TEST CX, 0001B ; 检查乘数最后一位是否为 1
    JZ SKIP_MULT   ; 如果不是 1,跳过乘法

    ; 执行乘法操作,将被乘数的每一位分别与乘数相乘
    MOV DX, AX     ; 将被乘数复制到 DX 寄存器
    SHL AX, 1      ; 将被乘数左移一位
    ADD BX, DX     ; 将乘积累加到结果寄存器中

    ; 跳过乘法部分
    SKIP_MULT:
    SHR CX, 1      ; 将乘数右移一位
    JNZ LOOP_START ; 判断是否还需循环

; 循环结束

执行该代码后,BX 寄存器中的值即为最终乘积。这里使用了 CX、AX 和 BX 这三个通用寄存器,同时涉及到了循环、条件判断和累加等多种操作。

示例2

再看一个更加复杂的例子,假设我们要实现 37 x 42,则:

  1. 取出 37 的最后一位数 7,即 0111B,转为十进制即 7。
  2. 将被乘数的每一位分别与 7 相乘,规则同上。
  3. 将已经得到的结果左移 4 位,相当于将最低 4 位空出来。
  4. 取出 37 的倒数第二位数 3,即 0011B,转为十进制即 3。
  5. 将被乘数的每一位分别与 3 相乘,同样左移 4 位。
  6. 将两次乘积的结果相加,即为最终乘积。

因此,我们可以得到下面的汇编代码:

MOV AX, 002AH ; 将被乘数赋值为 42
MOV CX, 0025H ; 将乘数赋值为 37
MOV BX, 0000H ; 用 BX 寄存器存储累积结果

; 开始循环
LOOP_START:
    TEST CX, 0001B ; 检查乘数最后一位是否为 1
    JZ SKIP_MULT   ; 如果不是 1,跳过乘法

    ; 执行乘法操作,将被乘数的每一位分别与乘数相乘
    MOV DX, AX     ; 将被乘数复制到 DX 寄存器
    SHL AX, 1      ; 将被乘数左移一位
    ADD BX, DX     ; 将乘积累加到结果寄存器中

    ; 跳过乘法部分
    SKIP_MULT:
    SHR CX, 1      ; 将乘数右移一位
    JZ END_LOOP    ; 如果乘数已经为 0,跳出循环

    ; 进入下一个循环,左移上一次乘积的结果
    SHL BX, 1

; 第一轮循环结束,左移结果 4 位
SHL BX, 4

; 开始第二轮循环,重复操作上面的步骤
MOV AX, 002AH ; 将被乘数赋值为 42
MOV CX, 0003H ; 将乘数赋值为 3
LOOP_START2:
    TEST CX, 0001B ; 检查乘数最后一位是否为 1
    JZ SKIP_MULT2  ; 如果不是 1,跳过乘法

    ; 执行乘法操作,将被乘数的每一位分别与乘数相乘
    MOV DX, AX     ; 将被乘数复制到 DX 寄存器
    SHL AX, 1      ; 将被乘数左移一位
    ADD BX, DX     ; 将乘积累加到结果寄存器中

    ; 跳过乘法部分
    SKIP_MULT2:
    SHR CX, 1      ; 将乘数右移一位
    JZ END_LOOP2   ; 如果乘数已经为 0,跳出循环

    ; 进入下一个循环,左移上一次乘积的结果
    SHL BX, 1

; 第二轮循环结束,得到最终权值
END_LOOP2:

; 循环结束,BX 寄存器中的值即为最终乘积

这里使用了两次循环,每次都涉及到了多种操作,需要细心观察和理解才能掌握实现方法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:汇编语言功能用循环累加实现乘法 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • Tensorflow学习教程——利用卷积神经网络对mnist数据集进行分类_利用训练好的模型进行分类

    #coding:utf-8 import tensorflow as tf from PIL import Image,ImageFilter from tensorflow.examples.tutorials.mnist import input_data def imageprepare(argv): # 该函数读一张图片,处理后返回一个数组,进到网络…

    卷积神经网络 2023年4月8日
    00
  • python opencv实现灰度图和彩色图的互相转换

    下面是关于使用Python OpenCV实现灰度图和彩色图的互相转换的完整攻略。 示例1:将彩色图转换为灰度图 以下是一个将彩色图转换为灰度图的示例: import cv2 # 读取彩色图像 img = cv2.imread(‘color_image.jpg’) # 将彩色图像转换为灰度图像 gray_img = cv2.cvtColor(img, cv2.…

    卷积神经网络 2023年5月16日
    00
  • 超图卷积网络(HyperGCN: A New Method of Training Graph Convolutional Networks on Hypergraphs)

    1. 简介 (Introduction) 1.1 背景 (Backgrounds) 在许多诸如co-authorship网络,co-citation网络等现实世界的网络中,关系是复杂的并且超出了成对关联。超图(Hypergraph)提供了一种灵活而自然的建模工具来对这种复杂的关系进行建模。在许多真实的网络中,这种复杂关系普遍存在,因此激发了使用超图学习的问题…

    2023年4月5日
    00
  • YOLOv5中SPP/SPPF结构源码详析(内含注释分析)

    让我详细讲解一下“YOLOv5中SPP/SPPF结构源码详析(内含注释分析)”的完整攻略,过程中将包含两个示例说明。 首先,让我们回顾一下SPP(Spatial Pyramid Pooling)结构的定义。SPP结构是一种特殊的池化层,目的是在不同尺度下对图像进行池化(Pooling)。这种结构可以在不同尺寸的特征图上利用ROI池化不同尺度下的特征信息,提高…

    卷积神经网络 2023年5月15日
    00
  • 注意:卷积运算的简单理解

    卷积操作是对图像处理时,经常用到的一种操作。它具有增强原信号特征,并且能降低噪音的作用。 那么具体是如何计算的呢?     步骤:   1)将算子围绕中心旋转180度     2)  滑动算子,使其中心位于输入图像g的(i,j)像素上     3)  利用公式求和,得到输出图像的(i,j)像素值 (2,4)元素值=  1* 2+  8*  9+15* 4  …

    2023年4月6日
    00
  • 手写数字识别——基于LeNet-5卷积网络模型

      在《手写数字识别——利用Keras高层API快速搭建并优化网络模型》一文中,我们搭建了全连接层网络,准确率达到0.98,但是这种网络的参数量达到了近24万个。本文将搭建LeNet-5网络,参数仅有6万左右,该网络是由Yann LeCun在1998年提出,是历史上第一代卷积神经网络。关于其历史可阅读另一篇博客《冬日曙光——回溯CNN的诞生》。     Le…

    2023年4月6日
    00
  • 使用opencv实现自定义卷积

    对图像进行卷积是图像处理的基本操作,最近在研究图像滤波,经常要用到自定义卷积,所以实现了一下 1 #include “opencv2/imgproc/imgproc.hpp” 2 #include “opencv2/highgui/highgui.hpp” 3 4 using namespace cv; 5 6 Mat get_blur_kernel(int…

    卷积神经网络 2023年4月8日
    00
  • CNN中卷积层的计算细节

    转载自:https://blog.csdn.net/dcrmg/article/details/79652487   前几天在看CS231n中的CNN经典模型讲解时,花了一些时间才搞清楚卷积层输入输出的尺寸关系到底是什么样的,现总结如下。(可以参照我画的题图理解卷积层的运算)   卷积层尺寸的计算原理 输入矩阵格式:四个维度,依次为:样本数、图像高度、图像宽…

    2023年4月7日
    00
合作推广
合作推广
分享本页
返回顶部