【汇编语言】乘法(MUL/IMUL)

乘法(MUL/IMUL)

目录

      • 乘法(MUL/IMUL)
        • `IMUL`(signed multiply)有符号数乘法
        • `MUL`(unsigned multiply)无符号数乘法

麻!属实是被这个有符号乘法给整麻了,教材就一行例子直接不解释了,关于标志位溢出的一概不谈,屁用没有。然后去网上查了查好像说明白了但又没完全明白,以至于我刚刚才明白

先说这有符号乘法!

IMUL(signed multiply)有符号数乘法

格式:MUL SRC

操作:

  • 当操作数为字节时,(AX)←(AL)×(SRC)(AX)\gets (AL)\times (SRC)(AX)(AL)×(SRC)
  • 当操作数为字时,(DX,AX)←(AX)×(SRC)(DX, AX)\gets (AX)\times(SRC)(DX,AX)(AX)×(SRC)

标志位响应:

  • 当乘积的高半部分是低半部分的符号扩展时,表示未溢出,OF=CF=0OF=CF=0OF=CF=0
  • 当乘积的高半部分不是低半部分的符号扩展时,表示溢出,OF=CF=1OF=CF=1OF=CF=1

符号扩展

微机系统中,有时需要将一个数据从位数较少扩展到位数较多,例如,在执行除法指令时,由于对字节除数相除要求被除数为16位,对字除数要求被除数为32位,即被除数必须为除数的倍长数据,因此就涉及数据的位数扩展问题,具体的扩展有符号扩展与零扩展两种方法

  1. 当要扩展的数据是无符号数时可采用零扩展。即在最高位前扩展0,补充够位数即可
  2. 当要扩展的数据是有符号数时需采用符号扩展。由于采用补码形式表示的整数具有固定的长度,因此在汇编指令系统中,经常有一些指令需要将其中的操作数进行符号位扩展。譬如两个8位或16位数据进行相加或者相减运算时,当有不足位数要求的数据时,需要将少位数据扩展成与位数要求相一致的数据;两个数据相除时,被除数应必须是除数的倍数等。 符号扩展的方法是将需要扩展的数据的符号位填入到扩展的每一位,以保持其作为有符号数的值的大小不变。这里要注意,要扩展的数须是用补码形式表示的有符号数,符号扩展后。其结果仍是该数的补码。 因此,对于补码表示的数,其正数的符号扩展是将其符号位0向左扩展(补0);其负数的符号扩展是将其符号位1向左扩展(补1)

有符号数相乘的步骤

  1. 符号位扩展,将两个乘数都扩展至原来的两倍大(例如,字节数据100011011000\ 11011000 1101扩展为字数据11111111100011011111\ 1111\ 1000\ 11011111 1111 1000 1101
  2. 扩展后的数据相乘
  3. 取有效位(即为原乘数位数的两倍)

举例:

F1H×F1HF1H\times F1HF1H×F1H(−15)×(−15)=(+225)(-15)\times (-15)=(+225)(15)×(15)=(+225)

  1. 符号位扩展
    11110001→11111111111100011111\ 0001\to {\color{Blue} 1111\ 1111} \ 1111\ 00011111 00011111 1111 1111 0001

  2. 扩展后的数据相乘
    1111111111110001×111111111111000111111111111000100000000011100001\begin{array}{r} {\color{Blue} 1111\ 1111} \ 1111\ 0001\\ \times {\color{Blue} 1111\ 1111} \ 1111\ 0001\\ \hline {\color{Gray} 1111\ 1111\ 1110\ 0010} \ 0000\ 0000\ 1110\ 0001 \end{array}1111 1111 1111 0001×1111 1111 1111 00011111 1111 1110 0010 0000 0000 1110 0001

  3. 取有效位
    保留低16位有效位00000000111000010000\ 0000\ 1110\ 00010000 0000 1110 0001
    AH=00HAH=00HAH=00HAL=E1HAL=E1HAL=E1H

  4. 判断标志位响应
    由于AHAHAH并不是ALALAL的符号扩展
    0000000011100001{\color{Green} 0000\ 0000} \ {\color{Red} 1} 110\ 00010000 0000 1110 0001
    AHAHAH全为0,而ALALAL最高位(符号位)为1,因此溢出OF=CF=1OF=CF=1OF=CF=1

    有符号数乘积的高半部分只起到表示符号的作用,溢出时,其是无效的信息可不关注,因此对于8位有符号数相乘不溢出的结果范围即为−128-128128 ~ +127+127+127,这里低8位最高位为1表示结果为负数,而两乘数均为负数,结果应为正数,故产生了溢出

  5. debug测试
    在这里插入图片描述

24H×FDH24H\times FDH24H×FDH(+36)×(−3)=(−108)(+36)\times (-3)=(-108)(+36)×(3)=(108)

0000000000100100×111111111111110100000000001000111111111110010100\begin{array}{r} {\color{Blue} 0000\ 0000} \ 0010\ 0100\\ \times {\color{Blue} 1111\ 1111} \ 1111\ 1101\\ \hline {\color{Gray} 0000\ 0000\ 0010\ 0011} \ {\color{Green} 1111\ 1111\ 1} 001\ 0100 \end{array}0000 0000 0010 0100×1111 1111 1111 11010000 0000 0010 0011 1111 1111 1001 0100

这里高半部分是低半部分的符号扩展,因此未溢出,OF=CF=0OF=CF=0OF=CF=0,这里结果100101001001\ 01001001 0100即为−108-108108的补码形式

在这里插入图片描述

MUL(unsigned multiply)无符号数乘法

格式与操作与IMUL相同,用来作无符号数乘法

标志位响应:

  • 当乘积的高半部分不为0时,表示溢出,CF=OF=1CF=OF=1CF=OF=1
  • 当乘积的高半部分为0时,表示未溢出,CF=OF=0CF=OF=0CF=OF=0

很简单就直接乘,乘就完事了!直接上例子(和有符号的第一个例子数据相同,看其对比)

举例:

F1H×F1HF1H\times F1HF1H×F1H241×241=58081241\times 241=58081241×241=58081

11110001×111100011110001011100001\begin{array}{r} 1111\ 0001\\ \times 1111\ 0001\\ \hline 1110\ 0010\ 1110\ 0001 \end{array}1111 0001×1111 00011110 0010 1110 0001

显然这里高半部分不为0,故溢出CF=OF=1CF=OF=1CF=OF=1

在这里插入图片描述

这里的溢出和有符号的溢出都是针对于低半部分范围而言的,即对于无符号数的乘积不溢出的范围则是000 ~ 255255255,但是由于高半部分的数据由AXAXAX的高半部分AHAHAH存储,故虽说是“溢出”但是其总的结果是正确的、有效的;而对于有符号乘积,其AHAHAH存的只是符号扩展信息,当发生溢出时,则代表该结果是错误的

另外,无符号数相乘结果总是正确的,因为最大的乘积也不会超越其乘数位数的两倍可表示的范围

11111111×111111111111111000000001\begin{array}{r} 1111\ 1111\\ \times 1111\ 1111\\ \hline 1111\ 1110\ 0000\ 0001 \end{array}1111 1111×1111 11111111 1110 0000 0001

FFH×FFH=FE01HFFH\times FFH=FE01HFFH×FFH=FE01H

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/380130.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【转】MFC学习总结

HBRUSH CAboutDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { if ((pWnd->GetDlgCtrlID() IDC_EDIT1) && (nCtlColor CTLCOLOR_EDIT)) {   COLORREF clr RGB(255,0,0);   pDC->SetTextColor(clr);  //设置红色的文本   clr RGB(0,0,0…

NHibernate初学体验进阶篇

在上篇《NHibernate初学体检记》中&#xff0c;我参照NHibernate官方快速指南写了两个示例项目&#xff0c;在示例2的源码中充斥了如下类似的代码&#xff1a;<?XML:NAMESPACE PREFIX O />Configuration cfg new Configuration(); cfg.AddAssembly("…

eclipse快捷键

Java开发工具(Eclipse的视窗和视图概述) A:视窗 每一个基本的窗体被称为视窗 PackageExplorer 显示项目结构&#xff0c;包&#xff0c;类&#xff0c;及资源Outline 显示类的结构&#xff0c;方便查找&#xff0c;识别&#xff0c;修改Console 程序运行的结果在该窗口显示Hie…

【汇编语言】除法(DIV/IDIV)

除法&#xff08;DIV/IDIV&#xff09; 目录除法&#xff08;DIV/IDIV&#xff09;DIV(unsigned divide)无符号数除法IDIV(signed divide)有符号数除法DIV(unsigned divide)无符号数除法 格式&#xff1a;DIV SRC 操作&#xff1a; SRCSRCSRC为字节时&#xff0c;(AL)←(AX)/…

java 方法 示例_Java集合syncedSortedSet()方法与示例

java 方法 示例集合类SynchronizedSortedSet()方法 (Collections Class synchronizedSortedSet() method) synchronizedSortedSet() method is available in java.util package. java.util软件包中提供了sharedSortedSet ()方法 。 synchronizedSortedSet() method is used to …

远控免杀专题(17)-Python-Rootkit免杀

免杀能力一览表 几点说明&#xff1a; 1、上表中标识 √ 说明相应杀毒软件未检测出病毒&#xff0c;也就是代表了Bypass。 2、为了更好的对比效果&#xff0c;大部分测试payload均使用msf的windows/meterperter/reverse_tcp模块生成。 3、由于本机测试时只是安装了360全家桶…

项目管理软件应用浅析(转)

项目管理是在一定的约束条件下&#xff0c;以高效率地实现项目业主的目标为目的&#xff0c;以项目经理个人负责制为基础和以项目为独立实体进行经济核算&#xff0c;并按照项目内在的逻辑规律进行有效的计划、组织、协调、控制的系统管理活动。项目管理的核心技术是网络计划技…

斜视角的讨论(转)

http://school.ogdev.net/listshow.asp?page4&typeid0&categoryid5&id0&ListType2 目 录 1.1 地图和地表 1.2 斜视角游戏中的视角 1.3 Tile图片的拼接 1.4 不同地表间的过渡 1.5 地图数据结构的定义 --------------------------------------------------…

计算机网络(湖科大教书匠)

计算机网络&#xff08;湖科大教书匠&#xff09; 本文档为教学视频【计算机网络微课堂&#xff08;有字幕无背景音乐版&#xff09;_哔哩哔哩_bilibili】的摘录 目录计算机网络&#xff08;湖科大教书匠&#xff09;一、绪论1.2 因特网概述1.2.1 网络、互连网&#xff08;互联…

经纬度

题目描述 给定地球的两个经纬度坐标&#xff0c;问这两个点的直线距离。假设地球为球体&#xff0c;半径为6371009米。 输入描述: 第一行一个整数T表示数据组数。 接下来n行&#xff0c;每行四个数lat1, lng1, lat2, lng2分别表示两个点的经纬度。 正数表示北纬和东经。 …

远控免杀专题(18)-ASWCrypter免杀

免杀能力一览表 几点说明&#xff1a; 1、上表中标识 √ 说明相应杀毒软件未检测出病毒&#xff0c;也就是代表了Bypass。 2、为了更好的对比效果&#xff0c;大部分测试payload均使用msf的windows/meterperter/reverse_tcp模块生成。 3、由于本机测试时只是安装了360全家桶…

Hibernate 笔记4 实现对数据库的增删改查

1 准备 首先在mysql数据库中建表User,并添加相关信息。 user表结构如下。 ---------------------------------------------------------| Field | Type | Null | Key | Default | Extra |------------------------------------------------…

Direct3D中的绘制(3)

立方体——只比三角形稍微复杂一点&#xff0c;这个程序渲染一个线框立方体。 这个简单的绘制和渲染立方体的程序的运行结果如下图所示&#xff1a; 源程序&#xff1a; /************************************************************************************** Renders a …

远控免杀专题(19)-nps_payload免杀

免杀能力一览表 几点说明&#xff1a; 1、上表中标识 √ 说明相应杀毒软件未检测出病毒&#xff0c;也就是代表了Bypass。 2、为了更好的对比效果&#xff0c;大部分测试payload均使用msf的windows/meterperter/reverse_tcp模块生成。 3、由于本机测试时只是安装了360全家桶…

VS2005中使用WebDeploymentProject的问题

近来做Web项目&#xff0c;VS2005中发布网站时默认发布大批的程序集&#xff0c;这给升级网站时造成很大麻烦&#xff0c;所以偶从MS下载了个WebDeploymentProject的插件&#xff08;下载地址http://download.microsoft.com/download/c/c/b/ccb4877f-55f7-4478-8f16-e41886607a…

操作系统中的多级队列调度

多级队列调度 (Multilevel queue scheduling) Every algorithm supports a different class of process but in a generalized system, some process wants to be scheduled using a priority algorithm. While some process wants to remain in the system (interactive proce…

编写一程序,输入一个字符串,查找该字符串中是否包含“abc”。

import java.lang.String.*;//这里调用java.long.String.contains()方法&#xff1b; import java.util.Scanner; public class shit {public static void main(String[] args) {Scanner wsq new Scanner(System.in);String str wsq.next();boolean status str.contains(&qu…

显示消息提示对话框(WebForm)

1: /// <summary>2: /// 显示消息提示对话框。3: /// Copyright (C) Maticsoft4: /// </summary>5: public class MessageBox6: { 7: private MessageBox()8: { 9: }10: 11: …

借助格式化输出过canary保护

0x01 canary保护机制 栈溢出保护是一种缓冲区溢出攻击缓解手段&#xff0c;当函数存在缓冲区溢出攻击漏洞时&#xff0c;攻击者可以覆盖栈上的返回地址来让shellcode能够得到执行。当启用栈保护后&#xff0c;函数开始执行的时候会先往栈里插入cookie信息&#xff0c;当函数真…

什么叫灰度图

任何颜色都有红、绿、蓝三原色组成&#xff0c;假如原来某点的颜色为RGB(R&#xff0c;G&#xff0c;B)&#xff0c;那么&#xff0c;我们可以通过下面几种方法&#xff0c;将其转换为灰度&#xff1a; 1.浮点算法&#xff1a;GrayR*0.3G*0.59B*0.11 2.整数方法&#xff1a;Gra…