首页 > 编程语言 >汇编-MUL和IMUL乘法

汇编-MUL和IMUL乘法

时间:2023-11-26 09:13:57浏览次数:27  
标签:操作数 乘积 16 32 IMUL MUL 乘法

32位模式下整数乘法可以实现32、16或8位的操作,64位下还可以使用64位操作数。

MUL执行无符号乘法,IMUL执行有符号乘法

MUL:无符号数乘法

32 位模式下,MUL(无符号数乘法)指令有三种类型:

执行 8 位操作数与 AL 寄存器的乘法;
执行 16 位操作数与 AX 寄存器的乘法;
执行 32 位操作数与 EAX 寄存器的乘法

MUL 指令中的单操作数是乘数。下表按照乘数的大小,列出了默认的被乘数和乘积。由于目的操作数是被乘数和乘数大小的两倍,因此不会发生溢岀,换句话说,两个8位二进制数的乘积不会超过16位

 如果乘积的高半部分不为零,则 MUL 会把进位标志位和溢出标志位置 1。

 

.386
.model flat,stdcall
.stack 4096

Include Irvine32.inc

.data
val2 WORD 0100h

.code
main PROC
    
    mov ax,2000h
    mul val2       ;DX:AX = 00200000h, CF = 1

    exit    
main ENDP
END  main

 

 

IMUL:有符号数乘法

与 MUL 指令不同,IMUL 会保留乘积的符号,但两个有符号8位数的乘积仍然不超过16位,不会因为有符号问题就超过16位。x86 指令集支持三种格式的 IMUL 指令:单操作数、双操作数和三操作数,而无符号的MUL指令只有单操作数

对于单操作数的IMUL指令,规则同无符号的MUL。和 MUL 指令一样,其乘积的存储大小使得溢出不会发生。同时,如果乘积的高半部分不是其低半部分的符号扩展,则进位标志位和溢出标志位置 1。利用这个特点可以决定是否忽略乘积的高半部分

单操作数

 

 

 

 

双操作数

对于双操作数的IMUL指令,用第一个操作数乘以第二个操作,将结果存放到第一个操作所在的寄存器。第一操作数必须是16或32位寄存器,第二操作可以是16或32位内存或寄存器,位数与第一操作数对应。第二操作数还可以是8位立即数且只能是8位的。双操作数格式会按照目的操作数的大小来截取乘积,乘积的高半部分会被丢弃。如果被丢弃的是有效位,则溢出标志位和进位标志位置 1。因此,在执行了有两个操作数的 IMUL 操作后,必须检查这些标志位中的一个。

 

三操作数

 对于三操作数的IMUL指令,第二和三个操作数的乘积存放到第一操作数中,第三操作数必须是立即数。若乘积有效位被丢弃,则溢出标志位和进位标志位置 1。因此,在执行了有三个操作数的 IMUL 操作后,必须检查这些标志位中的一个

格式如下:

imul 16位寄存器,16位寄存器或者内存,8或16位立即数

imul 32位寄存器,32位寄存器或者内存,8或32位立即数

 

 

 

 

 

 

 

 

 

 

 

 

 

标签:操作数,乘积,16,32,IMUL,MUL,乘法
From: https://www.cnblogs.com/liming19680104/p/17856518.html

相关文章

  • OpenMLDB SQL 开发调试神器 - OpenMLDB SQL Emulator
    今天为大家介绍一款来自OpenMLDB社区的优秀独立工具-OpenMLDBSQLSimulator(https://github.com/vagetablechicken/OpenMLDBSQLEmulator),可以让你更加高效方便的开发、调试OpenMLDBSQL。为了高效的实现时序特征计算,OpenMLDBSQL对标准SQL做了改进和扩展,因此初学者在使用......
  • (15-418)Lecture 2 A Modern Multi-Core Processor
    并行执行的方式本节内容围绕一个程序,针对如何改变处理器的结构来加速程序提出了多个idea示例程序:该程序通过泰勒展开式来估算sin(x)的值一个最简单的处理器,每个时钟周期只能执行一条指令,而利用ILP(指令级平行)的超标量处理器可同时执行两条指令(当指令间不存在依赖时),但示例程序......
  • R语言集成模型:提升树boosting、随机森林、约束最小二乘法加权平均模型融合分析时间序
    原文链接:http://tecdat.cn/?p=24148原文出处:拓端数据部落公众号 最近我们被要求撰写关于集成模型的研究报告,包括一些图形和统计输出。特别是在经济学/计量经济学中,建模者不相信他们的模型能反映现实。比如:收益率曲线并不遵循三因素的Nelson-Siegel模型,股票与其相关因素之间的......
  • C#通过循环绘制九九乘法表以及杨辉三角形
    九九乘法表 定义两个变量intx,y;for(x=1;x<=9;x++)//循环列{for(y=1;y<=x;y++)//循环行{Console.Write("{1}*{0}={2}",x,y,x*y);//显示出每一个式子}Console.WriteLine();//在每一行换行}杨辉三角形......
  • MDns C# 实现 Makaretu.Dns.Multicast
     1、创建一个DNS服务:可以使用MulticastService类来创建一个DNS服务实例,并为其指定主机名和端口号。varservice=newMulticastService("mydns.local",IPAddress.Parse("224.0.0.251"),5353);2、添加DNS解析记录:可以使用ServiceAnnouncement类来添加DNS解析记录,并将其......
  • Windows下mDNS查询API—DnsStartMulticastQuery/DnsStopMulticastQuery的使用
    背景及问题:目前很多局域网设备通过mNDS协议实现互联,IP地址为自动IP段-169.254.x.x,有时候设备厂家提供的API需要通过知晓局域网中的IP地址/设备名,才能连接该设备。这样要求每个软件必须配置设备名或者启动时遍历所有IP(6w+),不是很方便,这时候可以通过mDNS查询,自动拿到设备名,再进行连......
  • 打印九九乘法表
    publicclassjiujiu{publicstaticvoidmain(String[]args){//打印行数for(inti=1;i<=9;i++){//打印列数(行数等于列数)for(intj=1;j<=i;j++){System.out.print(j+"*"+i+"="+......
  • 罗德里格旋转公式(Rodrigues' rotation formula)
    https://zhuanlan.zhihu.com/p/115276808   ......
  • multiprocessing创建多进程
    参考https://zhuanlan.zhihu.com/p/410731610方法1:#!/usr/bin/python#-*-coding:UTF-8-*-frommultiprocessingimportProcessimporttimeimportosdeftest_proc(num):foriinrange(num):print('子进程运行中,i=%d,name=%s,pid=%d'%(i,......
  • Go语言打印九九乘法表,这是整洁代码范例
    Go语言打印九九乘法表,这是整洁代码范例/Go语言输出九九乘法表/九九乘法表是我们学习编程时的一项基本练习,它看似简单,通过实现输出九九乘法表可以加深对Go语言循环结构的理解和运用。本文将使用Go语言输出九九乘法表,内容涵盖:问题描述基本思路使用双层for循环......