`
zzc1684
  • 浏览: 1229451 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

学 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, stdcall include windows.inc include kernel32.inc include masm32.inc include debug.inc includelib kernel32.lib includelib masm32.lib includelib debug.lib .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
;把上面的例子稍作修改(mul -> imul), 得到了不同的结果: ; Test27_2.asm .386 .model flat, stdcall include windows.inc include kernel32.inc include masm32.inc include debug.inc includelib kernel32.lib includelib masm32.lib includelib debug.lib .data   val dd 8 .code main proc ;8 位   mov al, 0FFh   imul byte ptr val   PrintHex ax ;FFF8   ;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


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, stdcall include windows.inc include kernel32.inc include masm32.inc include debug.inc includelib kernel32.lib includelib masm32.lib includelib debug.lib .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
;MUL 与 IMUL 结果的一致于不一致: ; Test27_4.asm .386 .model flat, stdcall include windows.inc include kernel32.inc include masm32.inc include debug.inc includelib kernel32.lib includelib masm32.lib includelib debug.lib .data   val db 7Fh .code main proc ;如果操作数都没有符号位, 结果一致   mov al, 7Fh   mul val   PrintHex ax ;3F01     mov al, 7Fh   imul val   PrintHex ax ;3F01   ;如果操作数的其中之一有符号位, 结果不一致   mov al, 80h   mul val   PrintHex ax ;3F80     mov al, 80h   imul val   PrintHex ax ;C080   ;如果操作数都有符号位, 结果也一致   inc val   mov al, 80h   mul val   PrintHex ax ;4000     mov al, 80h   imul val   PrintHex ax ;4000   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

; DIV 测试 ; Test27_5.asm .386 .model flat, stdcall include 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 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
;IDIV 测试 ; Test27_6.asm .386 .model flat, stdcall include 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 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
分享到:
评论

相关推荐

    x86汇编指令集大全(带注释).pdf

    X86汇编指令集是计算机体系结构中不可或缺的一部分,特别是在32位和64位的x86架构处理器中。这篇文档详细列举了汇编指令,并为每条指令提供了注释说明。以下知识点涵盖了文档中提及的关键指令及其功能。 一、数据...

    x86逆向 - 基本运算:加减乘除1

    1. **常量 / 变量** 和 **变量 / 变量**:无优化空间时,使用`div`或`idiv`指令进行有符号或无符号除法。 2. **变量 / 常量**:对于无符号除以2的幂,可以使用右移`sar`进行数学优化,如向下取整、向上取整和向0取整...

    微机与接口复习提纲

    - 除法:DIV、IDIV。 - 扩展:CBW、CWD。 - 调整指令:DAA、DAS。 3. **逻辑运算指令**:AND、OR、NOT、XOR、TEST。 4. **移位指令**:SHL、SHR、SAL、SAR、ROL、ROR、RCL、RCR。 5. **输入输出指令**:IN、OUT。...

    汇编语言-三角形绘制

    - 解决方案:使用带符号的乘除指令IMUL和IDIV来处理坐标差值,确保即使差值为负也能正确绘制出三角形。 #### 主体程序代码详解 下面是一段具体的主体程序代码示例,用于展示顶点坐标值输入模块的部分实现逻辑: `...

    汇编指令手册

    ### 汇编指令手册详解 #### 数据传输指令:数据的高效搬运工 汇编语言是一种低级程序设计语言,它直接对应计算机的硬件指令集,因此在进行精确控制和性能优化方面具有无可比拟的优势。数据传输指令是汇编语言中最...

    汇编语⾔程序设计PPT-第10章

    - **IMUL指令:** 用于有符号整数的乘法。 - **实现步骤:** 1. 清零中间结果单元。 2. 如果乘数为零,则直接结束乘法运算。 3. 将乘数逻辑右移一位,判断是否为0,如果是则跳过加法步骤。 4. 中间结果加上被...

    汇编实验,一些指令的用途

    2. **算术运算**:通过`ADD`、`SUB`、`MUL`、`DIV`等指令进行基本数学运算。 3. **串处理**:利用`MOVSB`、`CMPSB`等指令进行字符串处理。 4. **控制转移**:通过`JMP`、`JE`、`JNE`等指令实现条件跳转。 5. **数据...

    云大汇编期末考点

    - **乘除指令**:MUL、IMUL、DIV、IDIV等。 #### 20. 几个END的差异 - **END**:程序结束指令。 - **ENDP**:过程结束指令。 - **ENDS**:段结束指令。 #### 21. Debug的各个命令和使用方法 - **W**:写入内存。 -...

    微型计算机原理和汇编语言 8086/8088 汇编语言指令表

    ### 微型计算机原理与8086/8088汇编语言指令解析 #### 概述 本文档详细介绍了8086/8088微型计算机系统的汇编语言指令集。这些指令是构成低级程序的基础,用于直接控制计算机硬件执行特定任务。下面将逐一解释附录B...

    8086汇编速查指令集

    ### 8086汇编语言指令集详解 #### 概述 在计算机科学领域,尤其是对于硬件层面的理解与操作,汇编语言是至关重要的工具之一。8086作为一款经典的16位微处理器,其汇编语言指令集不仅在当时具有划时代的意义,而且...

    学习经典a

    - **MUL/IMUL**: 乘法操作,分别用于无符号和有符号整数乘法。 - **DIV/IDIV**: 除法操作,分别用于无符号和有符号整数除法。 - **SHL/SAR**: 左移/算术右移,用于位操作,可以快速实现乘除运算。 - **AND/OR/XOR**:...

    8088汇编

    ### 8088汇编语言基础与指令详解 8088处理器是Intel公司推出的一款8位外部数据总线的16位微处理器,它标志着个人计算机时代的开端。汇编语言作为直接与硬件交互的低级编程语言,对理解和控制8088处理器至关重要。...

    算术运算类指令教学课件.ppt

    乘法通常由MUL和IMUL指令实现,除法则由DIV和IDIV指令执行。这些指令在处理数值乘除时,不仅涉及操作数的大小,还需要考虑溢出和符号问题,因此状态标志位的更新也更为复杂。 除了基本的加减乘除,还有其他算术运算...

    微机原理硬件编程实现控制等

    例如,在x86架构中,乘法指令MUL和IMUL,除法指令DIV和IDIV。这些指令处理二进制数值的乘除,可能涉及到溢出检查和其他计算细节。 3. **控制语句**:在硬件编程中,控制语句用于改变程序的执行流程,包括条件跳转...

Global site tag (gtag.js) - Google Analytics