学 Win32 汇编[27] - 乘除指令: MUL、IMUL、DIV、IDIV
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相关推荐
- Win32ASM学习[16] :乘除指令: MUL、IMUL、DIV、IDIV
---------------------------------------------------------------------------------------------------- ...
- 学 Win32 汇编[28] - 跳转指令: JMP、JECXZ、JA、JB、JG、JL、JE、JZ、JS、JC、JO、JP 等...
跳转指令分三类: 一.无条件跳转: JMP; 二.根据 CX.ECX 寄存器的值跳转: JCXZ(CX 为 0 则跳转).JECXZ(ECX 为 0 则跳转); 三.根据 EFLAGS 寄存器的标志位 ...
- 学 Win32 汇编[26] - 加减指令: INC、DEC、NEG、ADD、ADC、SUB、SBB、CMP
为什么80%的码农都做不了架构师?>>> ;INC(Increment): 加一 ;DEC(Decrement): 减一 ;NEG(Negate): 求补(求反) ;ADD(A ...
- 学 Win32 汇编[28] - 跳转指令: JMP、JECXZ、JA、JB、JG、JL、JE、JZ、JS、JC、JO、JP 等
跳转指令分三类: 一.无条件跳转: JMP; 二.根据 CX.ECX 寄存器的值跳转: JCXZ(CX 为 0 则跳转).JECXZ(ECX 为 0 则跳转); 三.根据 EFLAGS 寄存器的标志位 ...
- 8086汇编之乘法指令MUL
2023年4月22日,周六晚上. 今天写汇编作业的时候,碰到了MUL指令,于是把学习到的MUL指令知识记录下来,也可以通过写这篇博客彻底理清MUL指令. 当被乘数和乘数都是8位时: 怎么判断被乘数和乘 ...
- 学 Win32 汇编[17]: 关于压栈(PUSH)与出栈(POP) 之一
记得刚学多线程的时候, 碰到一个结构: //Delphi 的语法描述 PContext = ^TContext; _CONTEXT = recordContextFlags: DWORD;Dr0: D ...
- 学 Win32 汇编[12]: PTR、OFFSET、ADDR、THIS
为什么80%的码农都做不了架构师?>>> PTR: 指定要操作的数据尺寸 ; Test12_1.asm .386 .model flat, stdcallinclude win ...
- 初学 Delphi 嵌入汇编[27] - XCHG 指令: 交换寄存器的内容
为什么80%的码农都做不了架构师?>>> //XCHG 指令: 交换寄存器的内容 varx,y: Integer; beginx := 1; y := 9;asmmov eax ...
- 学 Win32 汇编[6]: 伪指令 DUP 与数组
为什么80%的码农都做不了架构师?>>> 声明数组实例: ; Test6_1.asm .386 .model flat, stdcallinclude windows.inc ...
最新文章
- jmeter常用插件介绍
- java compile_java中的CompileAPI入门及使用
- 曾经一手好牌,但如今却被网友怼或已堕落
- C/C++笔试题(基础题)
- 4.linux基础1
- 电信光纤ipv6-- 搭建属于自己的服务器
- 说说PHP中的命名空间相关概念
- 今日说“法”:FPGA芯片如何选型?
- excel表格打印每页都有表头_13个关于Excel表格的打印技巧
- 淮安万达机器人_淮安万博机器人 万达上班时间【输入网址YB7888.vip】angmi_PP视频搜索-PP视频-原PPTV聚力视频...
- C语言判断是否可以构成三角形
- PowerMock使用-Mock私有方法
- AD使用技巧——如何改变布线走线的角度
- iPhone突然黑屏开不了机怎么办?3种解决方法分享
- spring-boot-mvc启动流程
- Esp8266天猫精灵_RGB灯_非点灯平台
- “专业网络犯罪分子”对英国电信供应商进行 DDoS 攻击
- subprocess.Popen(执行命令)
- selenium模拟登陆截取验证码
- 常微分方程 $5 微分方程稳定性