建设网站 如何给文件命名产品外观设计流程
建设网站 如何给文件命名,产品外观设计流程,廊坊视频优化展现,建设购物网站IMUL(有符号数乘法)指令执行有符号整数乘法。与 MUL 指令不同#xff0c;IMUL 会保留乘 积的符号#xff0c;实现的方法是#xff0c;将乘积低半部分的最高位符号扩展到高半部分。x86 指令集支持三种格式的 IMUL 指令#xff1a;单操作数、双操作数和三操作数。单操作数格式…IMUL(有符号数乘法)指令执行有符号整数乘法。与 MUL 指令不同IMUL 会保留乘 积的符号实现的方法是将乘积低半部分的最高位符号扩展到高半部分。x86 指令集支持三种格式的 IMUL 指令单操作数、双操作数和三操作数。单操作数格式中乘数和被乘数大小相同而乘积的大小是它们的两倍。单操作数格式单操作数格式将乘积存放在 AX、DX:AX 或 EDX:EAX 中IMUL reg/mem8 ; AX AL * reg/mem8IMUL reg/meml6 ; DX:AX AX * reg/meml6IMUL reg/mem32 ; EDX:EAX EAX * reg/mem32和 MUL 指令一样其乘积的存储大小使得溢出不会发生。同时如果乘积的高半部分不是其低半部分的符号扩展则进位标志位和溢出标志位置 1。利用这个特点可以决定是否忽略乘积的高半部分。双操作数格式(32位模式)32 位模式中的双操作数 IMUL 指令把乘积存放在第一个操作数中这个操作数必须是寄存器。第二个操作数(乘数)可以是寄存器、内存操作数和立 即数。16位格式如下所示IMUL regl6, reg/meml6IMUL regl6, imm8IMUL regl6, imml632 位操作数类型如下所示乘数可以是 32 位寄存器、32 位内存操作数或立即数(8 位 或 32 位)IMUL reg32, reg/mem32IMUL reg32, inun8IMUL reg32, imm32双操作数格式会按照目的操作数的大小来截取乘积。如果被丢弃的是有效位则溢出标志位和进位标志位置 1。因此在执行了有两个操作数的 IMUL 操作后必须检查这些标志位中的一个。三操作数格式32 位模式下的三操作数格式将乘积保存在第一个操作数中。第二个操作数可以是 16 位寄存器或内存操作数它与第三个操作数相乘该操作数是一个8位或16 位立即数IMUL regl6, reg/meml6,imm8IMUL regl6, reg/meml6, iirrnl6而 32 位寄存器或内存操作数可以与 8 位或 32 位立即数相乘IMUL reg32, reg/mem32, imm8IMUL reg32, reg/mem32, imm32IMUL 执行时若乘积有效位被丢弃则溢出标志位和进位标志位置 1。因此在执行了有三个操作数的 IMUL 操作后必须检查这些标志位中的一个。在 64 位模式下执行 IMUL在 64 位模式下IMUL 指令可以使用 64 位操作数。在单操作数格式中64 位寄存器或内存操作数与 RAX 相乘产生一个 128 位且符号扩展的乘积存放到 RDX:RAX 寄存器中。在下面的例子中RBX 与 RAX 相乘产生 128 位的乘积 -16。mov rax, -4mov rbx, 4imul rbx ; RDX 0FFFFFFFFFFFFFFFFh, RAX -16也就是说十进制数 -16 在 RAX 中表示为十六进制 FFFF FFFF FFF0而 RDX 只包含 TRAX 的高位扩展即它的符号位。三操作数格式也可以用于 64 位模式。如下例所示被乘数 (-16) 乘以 4生成 RAX 中的乘积 -64.datamultiplicand QWORD -16.codeimul rax, multiplicand, 4 ; RAX FFFFFFFFFFFFFFC0 (-64)无符号乘法由于有符号数和无符号数乘积的低半部分是相同的因此双操作数和三操作数的 IMUL 指令也可以用于无符号乘法。但是这种做法也有一点不便的地方进位标志位和溢出标志位将无法表示乘积的高半部分是否为零。IMUL 示例下述指令执行 48 乘以 4乘积 192 保存在 AX 中。虽然乘积是正确的但是 AH 不是 AL 的符号扩展因此溢出标志位置 1mov al,48mov bl, 4imul bl ; AX 00C0h, OF 1下述指令执行 -4 乘以 4乘积 -16 保存在 AX 中。AH 是 AL 的符号扩展因此溢出标志位清零mov al, -4mov bl, 4imul bl ; AX FFF0h, OF 0下述指令执行 48 乘以 4乘积 192 保存在 DX:AX 中。DX 是 AX 的符号扩展因此溢出标志位清零mov ax, 48mov bx, 4imul bx ; DX:AX 000000C0h, OF 0下述指令执行 32 位有符号乘法 (4 823 424*-423)乘积 -2 040 308 352 保存在 EDX:EAX 中。溢出标志位清零因为 EDX 是 EAX 的符号扩展mov eax, 4823424mov ebx, -423imul ebx ; EDX:EAX FFFFFFFF86635D80h, OF 0下述指令展示了双操作数格式.dataword1 SWORD 4dword1 SDWORD 4.codemov ax, -16 ; AX -16mov bx, 2 ; BX 2imul bx, ax ; BX -32imul bx, 2 ; BX -64imul bx, word1 ; BX -256mov eax, -16 ; EAX -16mov ebx, 2 ; EBX 2imul ebx, eax ; EBX -32imul ebx, 2 ; EBX -64imul ebx, dword1 ; EBX -256双操作数和三操作数 IMUL 指令的目的操作数大小与乘数大小相同。因此有可能发生有符号溢出。执行这些类型的 IMUL 指令后总要检查溢岀标志位。下面的双操作数指令展示了有符号溢出因为 -64000 不适合 16 位目的操作数mov ax, -32000imul ax, 2 ; OF 1下面的指令展示的是三操作数格式包括了有符号溢出的例子.dataword1 SWORD 4dword1 SDWORD 4.codeimul bx, word1, -16 ; BX word1 * -16imul ebx, dword1, -16 ; EBX dword1 * -16imul ebx, dword1, -2000000000 ; 有符号溢出
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/88755.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!