`

MUL、IMUL、DIV

阅读更多
汇编基础一日一学习30 MUL

         大家好,今天这节课中我们来深入的学习下乘法指令。乘法指令有两种,一种是有符号整数乘法另一种是无符号整数乘法,今天我们来学习无符号整数乘法。
        
         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。
         很简单。

来个作业:
         1.写出 执行(9003h/50h)后的商和余数,以及相关寄存器的值。


参考文档:
http://hi.baidu.com/ilovetaibai/blog/item/d850307cbe5a8c0329388a6e.html
http://hi.baidu.com/ilovetaibai/blog/item/c290eaf9362f78d5b58f3177.html
http://hi.baidu.com/ilovetaibai/blog/item/a79f911b20e651bf4bedbc55.html
分享到:
评论

相关推荐

    Calcolatori-Elettronici-polito

    IMUL DIV / IDIV 流量控制说明无条件的飞跃跳开关构造: 条件跳JE / JNE JZ / JNZ JL / JB-JG / JA JC和JO 环形: LOOPE / LOOPNE-LOOPZ / LOOPNZ 修改某些标志的值:(CF,DF,IF) 位处理说明逻辑指令和或者异或...

    IBM-PC汇编语言指令集

    乘法和除法指令MUL、IMUL、DIV和IDIV则用于执行整数乘法和除法,MUL和IMUL适用于无符号和带符号整数,而DIV和IDIV则执行相应的除法运算。IMUL的结果可能会影响符号标志S。 非压缩BCD码的运算调整指令如AAA、AAS、A...

    实验二算术运算实验.docx

    - **乘法指令**:MUL处理无符号数乘法,IMUL处理带符号数乘法。 - **除法指令**:DIV处理无符号数除法,IDIV处理带符号数除法。 4. **标志位**: 在调试过程中,标志位非常重要,它们反映了运算的结果。例如,...

    《微机原理与应用》试卷(A)及参考答案.docx

    试题中还提到了IMUL、MUL、IDIV、DIV四个操作,这些都是关于算术运算的指令,其中IMUL和MUL是乘法,IDIV和DIV是整数除法。 4. **CPU寄存器**:8086/8088中有多个通用寄存器,如AX、BX、CX、DX,它们在计算和存储...

    精编汇编语言指令全集

    * MUL 和 IMUL 指令:乘法指令,语法:MUL OP、IMUL OP。格式:MUL r/m、IMUL r/m。 * DIV 和 IDIV 指令:除法指令,语法:DIV OP、IDIV OP。格式:DIV r/m、IDIV r/m。 位运算指令: * AND、OR、XOR、NOT、TEST ...

    纯8086/8088汇编指令表

    3. **乘法与除法 (MUL, DIV, IMUL, IDIV):** MUL和IMUL用于无符号和有符号整数的乘法,而DIV和IDIV用于无符号和有符号整数的除法。乘法的结果可能超出单个寄存器的范围,因此可能会使用到AX或DX:AX组合。例如,`IMUL...

    汇编语言指令系统、伪指令

    MUL、IMUL 二进制除法指令 DIV、IDIV指令 十进制算术运算 非压缩BCD码调整指令AAA、AAS、AAM、AAD 压缩BCD码调整指令DAA、DAS 位   运算   指令 逻辑运算指令 AND、OR、XOR指令 NOT、TEST...

    第章微机原理与接口技术2022优秀文档.ppt

    在汇编语言中,乘法和除法操作是通过特定的指令完成的,例如MUL和IMUL用于乘法,DIV和IDIV用于除法。 3.1.1 乘法指令 MUL指令用于执行无符号整数乘法,源操作数可以是字节、字或双字,目标操作数通常是AL或AX。IMUL...

    运算程序设计及应用举例.ppt

    乘法指令MUL和IMUL执行乘法,而DIV和IDIV用于整数除法。十进制调整指令DAA、DAS、AAA、AAS、AAM和AAD则在处理十进制数据时调整结果。 加法指令如ADD和ADC执行操作时,会对条件标志位产生影响。CF位表示无符号数相加...

    第三章-程序设计的基本技术PPT.ppt

    无符号数乘法(MUL指令)用于处理不考虑正负号的数值,它的格式是`MUL SRC`。例如,`MUL BX`会将AX寄存器的内容与BX寄存器的内容相乘,并将结果存放在AX(如果乘积不超过16位)或者DX:AX(如果超过16位)。当使用MUL...

    第三章__程序设计的基本技术.ppt

    乘法指令分为无符号数乘法(MUL)和带符号数乘法(IMUL)。无符号数乘法不关心数据的正负,仅关注是否有进位(CF)和溢出(OF),而带符号数乘法则会检查这些标志来确定结果的正确性和符号。例如,`IMUL BX`会将AX和...

    汇编指令速查手册.pdf

    2. 算术指令:ADD、ADC、SUB、SBB、MUL、IMUL、DIV、IDIV等,这些指令用于执行基本的算术操作。 3. 逻辑指令:AND、OR、XOR、NOT等,这些指令用于执行逻辑操作。 4. 控制传送指令:JMP、JE、JNE、JB、JA、JCXZ、...

    微型计算机原理与接口技术:4算术运算指令.ppt

    乘法指令包括MUL和IMUL两个指令。MUL指令将无符号数相乘,IMUL指令将有符号数相乘。这些指令将结果存放在AX或DX寄存器中,并将进位标志位CF和溢出标志位OF置为1或0。 五、除法指令 除法指令包括DIV和IDIV两个指令...

    实验二-算术运算实验.pdf

    3. 乘除法指令:MUL表示无符号数乘法指令,IMUL表示带符号数乘法指令,DIV表示无符号数除法指令,IDIV表示带符号数除法指令。 4. 符号位扩展指令:CBW表示从字节扩展到字的指令,CWD表示从字扩展到双字的指令。 5. ...

    汇编语言指令

    它们的格式为MUL OP、IMUL OP等。这些指令影响标志位C、P、A、Z、S、O。 DIV和IDIV指令: DIV和IDIV指令用于除法运算。它们的格式为DIV OP、IDIV OP等。 CBW和CWD指令: CBW和CWD指令用于有符号数扩展。它们的格式...

    计算机原理:第二章微型机指令系统2of4.ppt

    - **MUL** 和 **IMUL** 是两种乘法指令,用于执行无符号和带符号的乘法操作。MUL 指令的目标通常是累加器 AL 或 AX,对于16位乘法,结果会存储在 DX:AX 寄存器对中。例如,MUL BL 会将 AL 中的值与 BL 中的值相乘,...

    汇编语言程序设计(第二版)  

    汇编语言中可以进行各种算术逻辑运算,例如ADD、SUB、MUL、DIV、AND、OR、XOR、NOT等,例如W=X+Y+24-Z可以用ADD指令来实现。 2.7 数据传输指令 数据传输指令可以用来传输数据,例如MOV AX,X、MOV CX,AX、MOV BX,DX...

    汇编语言实验讲义实验2.pdf

    * 乘除法指令和符号位扩展指令:MUL、IMUL、DIV、IDIV、CBW、CWD * BCD 码的调整指令:DAA、DAS、AAA、AAS、AAM、AAD 实验内容与步骤: * 对于两组无符号数,087H 和 034H,0C2H 和 5FH,试编程求这两组数的和差积...

Global site tag (gtag.js) - Google Analytics