----------------------------------------------------------------------------------------------------------------------------------------------------------------------

一. 无符号数乘法指令 MUL(MULtiply)

格式: MUL OPRD  
 功能: 乘法操作.

说明: 1. OPRD为通用寄存器或存储器操作数.
           2. OPRD为源操作数,即作乘数.目的操作数是隐含的,即被乘数总是指定为累加器AX 或AL的内容.

3. 16位乘法时,AX中为被乘数.8位乘法时,AL为被乘数.当16位乘法时,32位的乘积存于DX及AX中;8位乘法的16位乘积存于AX中.

4. 操作过程: 字节相乘:(AX)<--(AL)*OPRD,当结果的高位字节(AH)不等于0时,则CF=1、OF=1.字相乘: (DX)(AX)<--(AX)*OPRD,当(DX)不等0时,则CF=1、OF=1

5. 示例 1: MUL BETA[BX]
                              MUL DI
                              MUL BYTE PTR ALFA 
                  
               示例 2: 设在W1和W2字单元中各有一个16位数,若求其乘积并存于W3开始的字单元中,可用以下指令组实现:
                              MOV AX,W1
                              MUL W2
                              MOV W3,AX 
                              MOV W3+2,DX

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

.data
    val dd 8
.code
main proc
    ;8 位
    mov al, 0FFh
    mul byte ptr val
    PrintHex ax  ;07F8
   
    ;16 位
    mov ax, 0FFFFh
    mul word ptr val
    PrintHex dx ;0007
    PrintHex ax ;FFF8
   
    ;32 位
    mov eax, 0FFFFFFFFh
    mul val
    PrintHex edx ;00000007
    PrintHex eax ;FFFFFFF8
    ret
main endp
end main

----------------------------------------------------------------------------------------------------------------------------------------------------------------------

二. 带符号数乘法指令 IMUL(Integer MULtiply)

格式: IMUL OPRD 
 功能: 完成两个带符号数的相乘

说明: 1. 其中OPRD为任一通用寄存器或存储器操作数.
           2. MUL指令对带符号相乘时,不能得到正确的结果.
          例如: (AL)=255
                (CL)=255

MUL CL
                (AX)=65025
          注意: 这对无符号数讲,结果是正确的,但对带符号数讲,相当于(-1)*(-1)结果应为+1,而65025对应的带符号数为-511,显然是不正确的.

3. 8088/8086指令系统提供了专用的带符号数乘法和除法指令.IMUL即为带符号乘法指令,它能保证得到正确的带符号数的乘积.

操作过程:字节相乘:(AX)<--(AL)*OPRD 
                     字相乘: (DX)(AX)<--(AX)*OPRD

4. 本指令影响标志位CF、OF.

;影响 OF、CF 标志位;第一种指令格式:

;IMUL r/m ;单操作数;如果参数是 r8/m8, 将把 AL 做乘数, 结果放在 AX

;如果参数是 r16/m16, 将把 AX 做乘数, 结果放在 EAX

;如果参数是 r32/m32, 将把 EAX 做乘数, 结果放在 EDX:EAX

;以上这些都是和 MUL 一样的, 只是运算结果有时一样、有时不一样.

;IMUL 还有另外两种指令格式:

;IMUL r16/r32, r16/r32/m16/m32/i

;双操作数, (1)*(2) -> (1)

;IMUL r16/r32, r16/r32/m16/m32, i

;三操作数, (2)*(3) -> (1)

----------------------------------------------------------------------------------------------------------------------------------------------------------------------

.data
    val dd 8
.code
main proc
    ;8 位
    mov al, 0FFh
    PrintDec al
    imul byte ptr val
    PrintHex ax  ;FFF8
    PrintDec ax  ;-8
;-------------------------   
    mov al,-8 ;F8
    mul byte ptr val
    PrintDec ax ;1984
    PrintHex ax ;07C0
;-------------------------   
    ;16 位
    mov ax, 0FFFFh
    imul word ptr val
    PrintHex dx ;FFFF
    PrintHex ax ;FFF8
   
    ;32 位
    mov eax, 0FFFFFFFFh
    imul val
    PrintHex edx ;FFFFFFFF
    PrintHex eax ;FFFFFFF8
    ret
main endp
end main

----------------------------------------------------------------------------------------------------------------------------------------------------------------------

.data
    val dd 8
.code
main proc
    ;IMUL 两个操作数
    mov eax, 7
    imul eax, val
    PrintDec eax ;56
   
    ;IMUL 三个操作数
    imul eax, val, 9
    PrintDec eax ;72
    ret
main endp
end main

----------------------------------------------------------------------------------------------------------------------------------------------------------------------

DIV、IDIV: 无符号除、有符号除

;它们没有定义对 EFLAGS 的影响
;它们的指令格式:
;DIV r/m  ;参数是除数

;如果参数是 r8/m8,   将把 AX      做被除数; 商 -> AL,  余数 -> AH
;如果参数是 r16/m16, 将把 DX:AX   做被除数; 商 -> AX,  余数 -> DX
;如果参数是 r32/m32, 将把 EDX:EAX 做被除数; 商 -> EAX, 余数 -> EDX

----------------------------------------------------------------------------------------------------------------------------------------------------------------------

.code
main proc
    ;除数是 8 位
    mov ax, 17   ;被除数
    mov cl, 3    ;除数
    div cl
    PrintDec al  ;5 - 商
    PrintDec ah  ;2 - 余数
   
    ;除数是 16 位
    mov dx, 0    ;
    mov ax, 17   ;dx:ax 是被除数
    mov cx, 3    ;cx    是除数
    div cx
    PrintDec ax  ;5 - 商
    PrintDec dx  ;2 - 余数
   
    ;除数是 32 位
    mov edx, 0   ;
    mov eax, 17  ;edx:eax 是被除数
    mov ecx, 3   ;ecx     是除数
    div ecx
    PrintDec eax ;5 - 商
    PrintDec edx ;2 - 余数
    ret
main endp
end main

----------------------------------------------------------------------------------------------------------------------------------------------------------------------

.code
main proc
    ;除数是 8 位
    mov al, -17  
    cbw          ;ax 是被除数
    mov cl, 3    ;除数
    idiv cl
    PrintDec al  ;-5 - 商
    PrintDec ah  ;-2 - 余数
   
    ;除数是 16 位
    mov ax, -17  
    cwd          ;dx:ax 是被除数
    mov cx, 3    ;cx    是除数
    idiv cx
    PrintDec ax  ;-5 - 商
    PrintDec dx  ;-2 - 余数
   
    ;除数是 32 位
    mov eax, -17 
    cdq          ;edx:eax 是被除数
    mov ecx, 3   ;ecx     是除数
    idiv ecx
    PrintDec eax ;-5 - 商
    PrintDec edx ;-2 - 余数
    ret
main endp
end main

----------------------------------------------------------------------------------------------------------------------------------------------------------------------

Win32ASM学习[16] :乘除指令: MUL、IMUL、DIV、IDIV相关推荐

  1. 学 Win32 汇编[27] - 乘除指令: MUL、IMUL、DIV、IDIV

    MUL: 无符号乘 ;影响 OF.CF 标志位 ;指令格式: ;MUL r/m ;参数是乘数;如果参数是 r8/m8, 将把 AL 做乘数, 结果放在 AX ;如果参数是 r16/m16, 将把 AX ...

  2. Win32ASM学习[10]:传送指令

    汇编指令的一般性要求: 1.两个操作数的尺寸必须一致; 2.操作数不能同为内存. ----------------------------------------------------------- ...

  3. 汇编语言学习之基本指令(上)

    汇编语言学习之基本指令(上) 汇编语言对大小写不敏感,所以笔者全部采用大写说明语法规则,实例中采用小写英文 文章目录 汇编语言学习之基本指令(上) 1.数据传送类指令 1.1传送指令MOV 1.2交换 ...

  4. 汇编学习笔记——汇编指令

    目录 汇编指令 nop指令 mov.add.sub指令 adc.sbb指令 and.or指令 移位指令 逻辑左/右移指令 循环左/右移指令 算术左/右移指令 带进位循环左/右移指令 inc指令 pus ...

  5. 计组(day5)8086指令系统——算术运算指令(乘除指令)

    知识点 1. 乘法指令 1.1 无符号数乘法(示例代码) 1.2 有符号数乘积(示例代码) 1.3 例题 2. 除法指令 2.1 字节除法(示例代码) 2.2 字除法(示例代码) 2.3 0中断(示例 ...

  6. SIMD学习 -- 用SSE2指令作点乘和累加计算

    这几天在做学校的一个学习小项目,需要用到SIMD指令计算提速.也是第一次碰这个,看了一些资料和代码,模仿着写了两个函数. void sse_mul_float(float *A, float *B, ...

  7. 运算指令——ADD、SUB、MUL、DIV

    ADD指令:加法 ADD S1 S2 D DADD S1 S2 D,D+1 SUB指令:减法 SUB S1 S2 D DSUB S1 S2 D,D+1 MUL:乘法 MUL S1 S2 D DMUL ...

  8. 通过电脑给继电器发送指令_三菱FX PLC学习之通信指令(上)

    点击上方蓝字关注我们 [免费抽奖]电气人不能错过的PLC书籍与软件! 通信指令本身不难,难的是对通信的理解.在学习PLC通信指令之前,我曾尝试去看通信相关的课程,然后告诉自己:算了,不必勉强自己,学不 ...

  9. Docker技术入门与实战 第二版-学习笔记-3-Dockerfile 指令详解

    前面已经讲解了FROM.RUN指令,还提及了COPY.ADD,接下来学习其他的指令 5.Dockerfile 指令详解 1> COPY 复制文件 格式: COPY  <源路径> .. ...

最新文章

  1. python基础 条件和循环
  2. nagios监控mysql主从复制
  3. 你会和丑且家境不好,但对你好的男孩结婚吗?
  4. 分享几个神奇有效的Python学习网站
  5. 7-71 爬动的蠕虫 (15 分)
  6. Visual Studio 2019 16.1 正式发布,更快更高效
  7. 永久修改MySQL字符集(适用Mysql5.5、Mysql5.6、Mysql5.7以上)
  8. python GUI初步
  9. pyqt5 点击开始执行_PyQt5教程——第一个程序(2)
  10. 神州数码DC交换机VSF配置命令
  11. 计算机辅助工程分析及应用论文,浅谈计算机辅助工程(CAE) 毕业设计(论文).doc...
  12. java ajax教程_JAVA AJAX教程第三章—AJAX详细讲解
  13. yum linux-headers,CentOS下yum安装缺少kernel-headers的解决方法
  14. 【数据】【自动化交易】Python获取中国股市行情和指数
  15. 苹果开发者计划注册流程
  16. 【unity 保卫星城】--- 开发笔记03(飞机类第一版)
  17. 九方财富更新招股书:上半年营收9亿 冲刺港股一年未果
  18. 路由器DMZ简单解说
  19. SpringBoot-JsonFormat与DateTimeFormat注解的使用
  20. p720 自带的磁带机备份aix系统

热门文章

  1. OpenGL中的颜色混合功能(一)
  2. 白名单模板_solidworks打开stp显示默认模板无效?如何解决!
  3. 需求调研(一)——调研流程和时间的把握
  4. 单商户商城系统功能拆解35—分销应用—分销概览
  5. stm32l151 ADC通过DMA通道定时采样电池电量
  6. node与npm版本对应关系以及使用nvm管理node版本
  7. Mp3Player VS Diskman(2)
  8. CRC码的编码、解码(循环冗余校验码)
  9. Linux下磁盘挂载
  10. ES5 ES6相关内容 day15