IMUL、MUL和div的用法

MUL是进行无符号乘法的指令。MUL(无符号乘法)指令有三种格式:第一种是将8位的操作数于al相乘。第二种是将16位的操作数与ax相乘; 第三种是将32位的操作数与eax进行相乘

         乘数和被乘数大小必须相同,乘积的尺寸是乘数/被乘数大小的两倍。 三种格式都既接受寄存器操作数,也接受内存操作数。但是不接受立即操作数(这点大家注意下)。

         例如:
        
         你想将al寄存器中的值乘上2,那么此时你需要将立即数2存放到一个寄存器中,然后通过mul指令相乘,或者将立即数放到一个内存地址中,然后通过内存单元的形式来进行相乘。

         举例:

         mov bl, 2
         mul bl           ;此刻将bl寄存器中的值乘上al寄存器中的值

         指令中唯一的一个操作数是乘数。
        
         也就是当我们的乘数是8位的时候,则与al相乘,如果我们的乘数是16位则与ax相乘,如果我们的乘数是32位则与eax寄存器相乘。


         那么下面我给出mul乘法的相关操作数的实例

       被乘数                 乘数               积
         al                   8位操作数                 ax
         ax                   16位操作数         dx:ax
         eax                 32位操作数               edx:eax

            因为如果我们的乘数是一个8位操作数的话,我们的结果存在在ax寄存器中。 如果是16位操作数的话,我们的结果存放在dx:ax中。如果dx不为0,则进位标志置位。
        
             在执行完mul指令后,我们一般要检查下进位标志。因为我们需要知道乘积的高半部分是否可以安全的忽略。
        
         例如:
           mov al, 6h
           mov bl, 10h
           mul bl  
         此刻我们检查进位标志cf = 0, 那么ah我们就可以将其忽略了,所以结果是60h。

       那么我们再来举一个例子:

         例如:

           mov ax, 6000
           mov bx, 5000
           mul bx
         我们检查进位标志,此时cf = 1。 那么我们的结果是dx:ax ,此时我们的dx = 1E00, ax = 0000 所以 最后我们的积 为 1E000000。

         其实我们从乘积就可以算出来cf是否置位了。

       1.接下来我们留个小作业,不要用其他辅助工具来计算。自己口算下,执行完后,积为多少?
        
               mov eax, 00800000
               mov ebx, 00200000
               mul ebx


汇编基础一日一学习31 IMUL

         大家好,今天我们来学习下有符号整数的乘法运算,IMUL指令。这个指令保留了乘积的符号位。IMUL指令,IA - 32指令集中有三种格式: 单操作数、双操作数和三操作数。 在单操作数格式中,乘数和被乘数尺寸大小相同,乘积的大小是乘数/被乘数大小的两倍。

       单操作数格式: 单操作数格式把乘积存储在累加器( ax, dx:ax, edx:eax)中。imul指令单操作数格式其实和我们昨天学习的mul指令格式基本一样。

       1.那么接下来我们来看下IMUL单操作数的格式:
         imul   8位寄存器/8位内存操作数
         imul 16位寄存器/16位内存操作数
         imul 32位寄存器/32位内存操作数



       2.双操作数数格式:
         imul 16位寄存器/ 16位寄存器-16位内存操作数
         imul 16位寄存器/ 8位立即数
         imul 16位寄存器/ 16位立即数

         从上面我们可以看出 双操作数格式中,乘积存储在第一个操作数中,第一个操作数必须是寄存器,第二个操作数可以是寄存器、内存操作数、或立即数。 上面双操作数我是按照16位来给大家举的一些例子。 它当然还可以是32位的。

        
         imul 32位寄存器/ 32位寄存器-32位内存操作数
         imul 32位寄存器/ 8位立即数
         imul 32位寄存器/ 32位立即数

       3.三操作数格式:

         imul 16位寄存器/ 16位寄存器-16位内存操作数/ 8位立即数
         imul 16位寄存器/ 16位寄存器-16位内存操作数/ 16位立即数

         三操作数格式把乘积存储在第一个操作数,一个16位寄存器可以被一个8位或者16位的立即数乘。

         imul 32位寄存器/ 32位寄存器 -32位内存操作数/ 8位立即数
         imul 32位寄存器/ 32位寄存器 -32位内存操作数/ 32位立即数


         如果有效位丢失,则溢出标志和进位标志置位。 使用三操作数格式时,一定要在执行完imul操作后检查相关操作位。
        
         好,光看理论估计你很迷糊,那么我们就来看几个实例:
        
         1. 例如 mov al, -3
                 mov bl, 6

                 imul bl
           此刻执行的时候(-3*6)的结果存放到ax寄存器中,由于上面我说了,在执行imul进行有符号整数的乘法运算时,保留了乘积的符号位,也就是说乘积的高半部分是低半部分的符号扩展。   符号扩展是什么意思呢? 也就是说 如果我们的乘积是个负数则,高半部分都为1,如果乘积是个正数的话,高半部分都为0。很显然我们(-3*6)是负数,所以此时高半部分肯定是1,不信大家来计算下。

           -3的16进制表示形式是0FDh
           好此刻我们将0FD转换成补码的形式,大家不知道还记得16进制整数转换补码的方法吗,用15减去各个进制位,最终结果+1。

         此刻
             FDh
             15 - F = 0
             15 - D = 2
             +   1   = 03h
          
             03*6h = 12h (注意10进制18 = 16进制12h)
            
             此刻我们将取12h的补码则为我们最后的乘积

             12h
             15 - 1 = E
             15 - 2 = D
             + 1 = EEh
             由于EEh的最高符号位是1,所以此时高半部分将扩展为低半部分的符号位,所以此时高半部分为FF(也就是全是二进制位1)。

                最终的结果是FFEEh,此时由于已经被扩展了,所以此时的of = 0。(也就是说如果没有扩展的话,of = 1)。

    

         2.再来看个例子
             mov al, 3h
             mov bl, 6h
             imul bl

        
             大家口算就可以算的出来,很显然3*6=18, 16进制 = 12h, 此时由于结果为正,因为结果是12h,但是我们也并不能通过of 或者是 if来指示乘积的高半部分是否为0,也就是说我们的imul虽然能进行无符号整数运算,但是我们不能通过它影响的标志位来进行判断。。


         3. 再来看个例子
           mov al, 48
           mov bl, 3
           imul bl
         很显然我们的结果为正数,得到的积+144存放在ax中,由于ah不是al的符号扩展,因为溢出标志位置位。 of =1


            
       4. 那么接下来我再来举个2操作数的。
         mov ax, -30h
         mov bx, 10h
         imul ax, bx
        
        
         那么-30 * 10 = -48 * 16 = -768
                                 = -300h
         然后我们求反码
         300
         15 - 3 = C
         15 - 0 = F
         15 - 0 = F
           + 1 = D00
         因为我们的结果是负数,因为我们的结果是存在ax寄存器中的,而由于上面说了有符号数值的乘积是带符号位扩展的,高4位应该全是1填充,所以最终结果为FD00h


     5.接下来我们来个3位操作数的。
         mov ax, -30h
         imul bx, ax, 2h
        
         这三个操作数的是将结果存放在第一个操作数中。
         -30 * 2 = -60
        
         这时候取反码
         15 - 6 = 9
         15 - 0 = F
         +1 = A0
         乘积 = FFA0h,存放到bx中。

        
        
     留个作业:
         1.
         mov ax, -60h
         imul bx, ax, 3
    
         问:乘积多少?


汇编基础一日一学习32 DIV

         大家好,今天我们来学习下无符号整数的除法运算指令,div(无符号)指令执行8位、16位和32位无符号整数的除法运算。指令中必须是唯一的一个寄存器或内存操作数是除数。
         div指令格式:
         div 8位寄存器/8位内存操作数
         div 16位寄存器/16位内存操作数
         div 32位寄存器/32位内存操作数


         div指令格式和我们的mul基本可以算作是相反的。那么我们看下被除数 、 除数、商、余数之间的关系。


         被除数                         除数                                 商         余数
         ax                 8位寄存器/8位内存操作数                 al           ah
         dx:ax                 16位寄存器/16位内存操作数                 ax         dx        
         edx:eax                 32位寄存器/32位内存操作数                 eax           edx
1.
         举个例子:
         mov ax, 0060h
         mov bl, 2
         div bl   ;al = 30h , ah = 00h

         那么执行完后, 商是30h ,余数是00h


2.
         在举个例子
         执行(6005h/100h),由于我们的出示是16位,所以被除数是放在dx:ax中的。 但是由于被除数是6005h,所以我们必须将dx清0.
         xor dx, dx
         mov ax, 6005h
         mov bx, 100h
         div bx
        
         那么执行后, 我们的ax = 0060h, dx = 0005h。 所以我们的商是60h, 余数是5h。
         很简单。

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

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

相关文章

jQuery 1.2 带来的兼容问题及对策

jQuery 1.2 中抛弃了不少之前的功能,因此不能向前兼容,而有不少非官方的 jQuery 插件(比如 thickbox),使用的是 jQuery 1.2 之前的语法开发的,如果这次还未根据新版本更新的,则可能会出现问题。…

EAX、ECX、EDX、EBX寄存器的作用

一般寄存器:AX、BX、CX、DX AX:累积暂存器,BX:基底暂存器,CX:计数暂存器,DX:资料暂存器 索引暂存器:SI、DI SI:来源索引暂存器,DI:目的索引暂存器 堆叠、基底暂存器:SP、BP SP:堆叠指标暂存器,BP:基底指标暂存器 EA…

简单的Delegate(委托)例子

今天学习一下好久都不愿意碰的Delegate,虽然不是很明白,还是写了一个小例子(参考园子里的朋友们的),希望加深一下印象.朋友们说它类似于C的函数指针,指向一个函数,运行的时候可以调用这个函数.步骤:1. 声明一个delegate对象。2. 实现和delegate具有相同参数和返回值的函数实现&…

汇编语言——第2次上机实验

实验要求: 求表达式x*yz-200的值 实验步骤: 1.按照实验要求,画出相应的计算流程图 可以看到,先算x*y(保存在dx:cx),然后扩展z为双字节(dx:ax)&am…

【第二届】Erlang Fans交流会(补充事宜)

详细参见:http://erlang-china.org/news/erlang-fans-fair.html 这里做些补充: 考虑到上海到珠海坐春秋航空的飞机有特价机票,本次活动的讲师也可报销上海至珠海来回的飞机票(要求是春秋航空)。 报名(普通参…

Codeforce 189B——Counting Rhombi

题意:给定一个矩形的长和宽,求这个矩形里有多少个菱形(可重叠)。 思路:规律题。小学3年级的练习题,直接找有多少的偶数对角线(横纵相乘),两重循环,暴力即可。…

SQL Server 2005 中附加只有mdf文件的数据库(修复置疑的数据库)

在利用VSTS中,VSTS不能创建团队项目,数据库ReportServer出现置疑现象,数据库无法打开。修复过程中,由于想利用SQL SERVER 2000的功能,先备份了ReportServer库文件和日志文件,然后删除数据库。在此之前先进行…

UVA 473——Raucous Rockers

题意:给定n个数,放到m个容器里,每个容器的容量是t(n个数的累加和不超过t),在不打乱放的顺序的情况下问最多能放多少个数? 思路:多维dp,f[i][j[k]表示前i个数放到第j个容器…

ZOJ 3932——Handshakes

题意:有n个学生分别进入房间,给出他进房间的时候的与他握手的朋友数v[i],求最多的朋友的个数。 思路:水,从最后一个往前递推,求出当i坐下后他与朋友握手的次数,然后加上他刚进房间时握手的次数即可。 code&…

STL中bitset的用法的整理

构造函数bitset<n> b;b有n位&#xff0c;每位都为0.参数n可以为一个表达式.如bitset<5> b0;则"b0"为"00000";bitset<n> b(unsigned long u);b有n位,并用u赋值;如果u超过n位,则顶端被截除如:bitset<5>b0(5);则"b0"为&quo…

想起温习一下JS中的this apply call arguments

很多时候讲到语言入门&#xff0c;大家会认为就是要了解一下语言的语法、数据类型和常用函数。这一课对于所有的计算机专业的毕业生来说都可以自学&#xff0c;然而在最近的实践中&#xff08;带了两个实习生自学js&#xff09;&#xff0c;我发现他们在学习js的时候会被这几个…

BZOJ 2818——Gcd

题意&#xff1a;给定n&#xff0c;求gcd&#xff08;x,y)p 的对数&#xff0c;其中&#xff08;1<x<y<n) 思路&#xff1a; 求(x, y) k, 1 < x, y < n的对数等于求(x, y) 1, 1 < x, y < n/k的对数&#xff01;所以&#xff0c;枚举每个质数p&#xff0…

刚安装Vs2008,安装时它弹出了一个一些常见问题的解决方案页,记录下

以此作为记录&#xff0c;以防出现问题时找不到解决方案 http://download.microsoft.com/download/5/2/6/52681ab9-da31-46bd-aef7-e2cb928f48ca/VSReadme.htm 转载于:https://www.cnblogs.com/hanxianlong/archive/2007/11/02/946392.html

关于资料和总结

ACM常用资料以及速查 数论及数学递推 康托展开 反素数 约数和定理 原根 Lucas定理 中国剩余定理 ploya定理 博弈树 Bell数 搜索以及图论 启发式搜索技术A* DLX精确覆盖 博客2

是否会成为问题——Linq to Sql的执行可能无法复用查询计划

查询计划 Sql Server在执行一条查询语句之前都对对它进行“编译”并生成“查询计划”&#xff0c;查询计划告诉Sql Server的查询引擎应该用什么方式进行工作。Sql Server会根据当前它可以收集到的各种信息&#xff08;例如内存大小&#xff0c;索引的统计等等&#xff09;把一条…

第七届山东省Acm程序设计竞赛赛后总结

其实这次相对来说是比较轻松的&#xff0c;经过差不多2年的磨合&#xff0c;大家的默契度已经配合的足够熟练&#xff0c;而对于考场的压力和紧张感&#xff0c;相比去年前几次要放松许多&#xff0c;说来实在奇怪&#xff0c;去年我们嚷嚷着要拿XXX&#xff0c;到最后一无所获…

再别康桥

轻轻的我走了&#xff0c;正如我轻轻的来&#xff1b;我轻轻的招手&#xff0c;作别西天的云彩。那河畔的金柳是夕阳中的新娘波光里的艳影&#xff0c;在我的心头荡漾。软泥上的青荇&#xff0c;油油的在水底招摇&#xff1b;在康河的柔波里&#xff0c;我甘心做一条水草那树荫…

Java在ACM中的应用

Chapter I. Java的优缺点各种书上都有&#xff0c;这里只说说用Java做ACM-ICPC的特点&#xff1a; (1) 最明显的好处是&#xff0c;学会Java&#xff0c;可以参加Java Challenge :) (2) 对于熟悉C/C的程序员来说&#xff0c;Java 并不难学&#xff0c;找本书&#xff0c;一两…

Lucas定理及组合数取模

首先给出这个Lucas定理&#xff1a; A、B是非负整数&#xff0c;p是质数。AB写成p进制&#xff1a;Aa[n]a[n-1]...a[0]&#xff0c;Bb[n]b[n-1]...b[0]。 则组合数C(A,B)与C(a[n],b[n])*C(a[n-1],b[n-1])*...*C(a[0],b[0]) modp同余 即&#xff1a;Lucas(n,m,p)c(n%p,m%p)*Luc…

系统优化设置-之二

5、关掉不必要的服务 单击“开始”→“设置”→“控制面板”。双击“管理工具”→“服务”&#xff0c;打开后将看到服务列表&#xff0c;有些服务已经启动&#xff0c;有些则没有。右键单击要配置的服务&#xff0c;然后单击“属性”。在“常规”选项卡上选择“自动”、“手动…