MUL: 无符号乘


;影响 OF、CF 标志位
;指令格式:
;MUL r/m  ;参数是乘数;如果参数是 r8/m8,   将把  AL 做乘数, 结果放在 AX
;如果参数是 r16/m16, 将把  AX 做乘数, 结果放在 EAX
;如果参数是 r32/m32, 将把 EAX 做乘数, 结果放在 EDX:EAX; Test27_1.asm
.386
.model flat, stdcallinclude    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib.dataval dd 8
.code
main proc;8 位mov al, 0FFhmul byte ptr valPrintHex ax  ;07F8;16 位mov ax, 0FFFFhmul word ptr valPrintHex dx ;0007PrintHex ax ;FFF8;32 位mov eax, 0FFFFFFFFhmul valPrintHex edx ;00000007PrintHex eax ;FFFFFFF8ret
main endp
end main;把上面的例子稍作修改(mul -> imul), 得到了不同的结果:; Test27_2.asm
.386
.model flat, stdcallinclude    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib.dataval dd 8
.code
main proc;8 位mov al, 0FFhimul byte ptr valPrintHex ax  ;FFF8;16 位mov ax, 0FFFFhimul word ptr valPrintHex dx ;FFFFPrintHex ax ;FFF8;32 位mov eax, 0FFFFFFFFhimul valPrintHex edx ;FFFFFFFFPrintHex eax ;FFFFFFF8ret
main endp
end main

IMUL: 有符号乘


;影响 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);其中常数 i 的位数可以 <= 但不能 > 其他操作数; Test27_3.asm
.386
.model flat, stdcallinclude    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib.dataval dd 8
.code
main proc;IMUL 两个操作数mov eax, 7imul eax, valPrintDec eax ;56;IMUL 三个操作数imul eax, val, 9PrintDec eax ;72ret
main endp
end main;MUL 与 IMUL 结果的一致于不一致:; Test27_4.asm
.386
.model flat, stdcallinclude    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib.dataval db 7Fh
.code
main proc;如果操作数都没有符号位, 结果一致mov al, 7Fhmul valPrintHex ax ;3F01mov al, 7Fhimul valPrintHex ax ;3F01;如果操作数的其中之一有符号位, 结果不一致mov al, 80hmul valPrintHex ax ;3F80mov al, 80himul valPrintHex ax ;C080;如果操作数都有符号位, 结果也一致inc valmov al, 80hmul valPrintHex ax ;4000mov al, 80himul valPrintHex ax ;4000ret
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; DIV 测试
; Test27_5.asm
.386
.model flat, stdcallinclude    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib.code
main proc;除数是 8 位mov ax, 17   ;被除数mov cl, 3    ;除数div clPrintDec al  ;5 - 商PrintDec ah  ;2 - 余数;除数是 16 位mov dx, 0    ;mov ax, 17   ;dx:ax 是被除数mov cx, 3    ;cx    是除数div cxPrintDec ax  ;5 - 商PrintDec dx  ;2 - 余数;除数是 32 位mov edx, 0   ;mov eax, 17  ;edx:eax 是被除数mov ecx, 3   ;ecx     是除数div ecxPrintDec eax ;5 - 商PrintDec edx ;2 - 余数ret
main endp
end main;IDIV 测试
; Test27_6.asm
.386
.model flat, stdcallinclude    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib.code
main proc;除数是 8 位mov al, -17   cbw          ;ax 是被除数mov cl, 3    ;除数idiv clPrintDec al  ;-5 - 商PrintDec ah  ;-2 - 余数;除数是 16 位mov ax, -17   cwd          ;dx:ax 是被除数mov cx, 3    ;cx    是除数idiv cxPrintDec ax  ;-5 - 商PrintDec dx  ;-2 - 余数;除数是 32 位mov eax, -17  cdq          ;edx:eax 是被除数mov ecx, 3   ;ecx     是除数idiv ecxPrintDec eax ;-5 - 商PrintDec edx ;-2 - 余数ret
main endp
end main

转载于:https://www.cnblogs.com/del/archive/2010/04/15/1712950.html

学 Win32 汇编[27] - 乘除指令: MUL、IMUL、DIV、IDIV相关推荐

  1. Win32ASM学习[16] :乘除指令: MUL、IMUL、DIV、IDIV

    ---------------------------------------------------------------------------------------------------- ...

  2. 学 Win32 汇编[28] - 跳转指令: JMP、JECXZ、JA、JB、JG、JL、JE、JZ、JS、JC、JO、JP 等...

    跳转指令分三类: 一.无条件跳转: JMP; 二.根据 CX.ECX 寄存器的值跳转: JCXZ(CX 为 0 则跳转).JECXZ(ECX 为 0 则跳转); 三.根据 EFLAGS 寄存器的标志位 ...

  3. 学 Win32 汇编[26] - 加减指令: INC、DEC、NEG、ADD、ADC、SUB、SBB、CMP

    为什么80%的码农都做不了架构师?>>>    ;INC(Increment): 加一 ;DEC(Decrement): 减一 ;NEG(Negate): 求补(求反) ;ADD(A ...

  4. 学 Win32 汇编[28] - 跳转指令: JMP、JECXZ、JA、JB、JG、JL、JE、JZ、JS、JC、JO、JP 等

    跳转指令分三类: 一.无条件跳转: JMP; 二.根据 CX.ECX 寄存器的值跳转: JCXZ(CX 为 0 则跳转).JECXZ(ECX 为 0 则跳转); 三.根据 EFLAGS 寄存器的标志位 ...

  5. 8086汇编之乘法指令MUL

    2023年4月22日,周六晚上. 今天写汇编作业的时候,碰到了MUL指令,于是把学习到的MUL指令知识记录下来,也可以通过写这篇博客彻底理清MUL指令. 当被乘数和乘数都是8位时: 怎么判断被乘数和乘 ...

  6. 学 Win32 汇编[17]: 关于压栈(PUSH)与出栈(POP) 之一

    记得刚学多线程的时候, 碰到一个结构: //Delphi 的语法描述 PContext = ^TContext; _CONTEXT = recordContextFlags: DWORD;Dr0: D ...

  7. 学 Win32 汇编[12]: PTR、OFFSET、ADDR、THIS

    为什么80%的码农都做不了架构师?>>>    PTR: 指定要操作的数据尺寸 ; Test12_1.asm .386 .model flat, stdcallinclude win ...

  8. 初学 Delphi 嵌入汇编[27] - XCHG 指令: 交换寄存器的内容

    为什么80%的码农都做不了架构师?>>>    //XCHG 指令: 交换寄存器的内容 varx,y: Integer; beginx := 1; y := 9;asmmov eax ...

  9. 学 Win32 汇编[6]: 伪指令 DUP 与数组

    为什么80%的码农都做不了架构师?>>>    声明数组实例: ; Test6_1.asm .386 .model flat, stdcallinclude windows.inc ...

最新文章

  1. jmeter常用插件介绍
  2. java compile_java中的CompileAPI入门及使用
  3. 曾经一手好牌,但如今却被网友怼或已堕落
  4. C/C++笔试题(基础题)
  5. 4.linux基础1
  6. 电信光纤ipv6-- 搭建属于自己的服务器
  7. 说说PHP中的命名空间相关概念
  8. 今日说“法”:FPGA芯片如何选型?
  9. excel表格打印每页都有表头_13个关于Excel表格的打印技巧
  10. 淮安万达机器人_淮安万博机器人 万达上班时间【输入网址YB7888.vip】angmi_PP视频搜索-PP视频-原PPTV聚力视频...
  11. C语言判断是否可以构成三角形
  12. PowerMock使用-Mock私有方法
  13. AD使用技巧——如何改变布线走线的角度
  14. iPhone突然黑屏开不了机怎么办?3种解决方法分享
  15. spring-boot-mvc启动流程
  16. Esp8266天猫精灵_RGB灯_非点灯平台
  17. “专业网络犯罪分子”对英国电信供应商进行 DDoS 攻击
  18. subprocess.Popen(执行命令)
  19. selenium模拟登陆截取验证码
  20. 常微分方程 $5 微分方程稳定性

热门文章

  1. 如何快速进入一个陌生的领域,高手通常用这三步
  2. 罗永浩的公司被收购,还清债务指日可待
  3. 男朋友花3000元买一块电脑显卡,他是怎么想的?
  4. Pytorch-张量的创建与使用方法
  5. linux box 信息发布,使用Instantbox快速搭建一个开箱即用的Web端临时Linux系统
  6. 学习SQL:将SQL Server导出到Excel
  7. sql server 并发_并发问题– SQL Server中的理论和实验
  8. 在SQL Server 2016中使用动态数据屏蔽来保护敏感数据
  9. IOS开发之日期时间格式化字符说明
  10. 2015年 StoiGdoi 反思总结与未来计划