X86乘法指令以及位运算汇编浅谈

int i=8*8;

对应的汇编代码(没有直接反汇编,可能有些地方不对)

MOV EAX, 8     ; 将8存储到EAX寄存器
MOV ECX, 8     ; 将8存储到ECX寄存器MUL ECX        ; 用ECX寄存器中的值乘以EAX寄存器中的值,并将结果存储在EDX:EAX中(64位结果)

位运算汇编(常见)

1. 与运算
AND destination, source  ; 将destination和source按位进行与运算,并将结果存储在destination中

2. 或运算
OR destination, source   ; 将destination和source按位进行或运算,并将结果存储在destination中

3. 异或运算
XOR destination, source  ; 将destination和source按位进行异或运算,并将结果存储在destination中

4. 取反运算
NOT destination         ; 对destination寄存器中的值按位取反,并将结果存储在destination中

5. 左移运算
SHL destination, count  ; 将destination寄存器中的值左移count位,并将结果存储在destination中
SHLD destination, source, count  ; 将source寄存器中的值左移count位,并将结果存储在destination中,多余的位从source的右侧获取

6. 右移运算
SHR destination, count  ; 将destination寄存器中的值右移count位,并将结果存储在destination中
SHRD destination, source, count  ; 将source寄存器中的值右移count位,并将结果存储在destination中,多余的位从destination的左侧获取

位运算实现乘法代码


#include <stdio.h>
int multiply(int a, int b);
int main() {
    int a = 5;
    int b = 7;
    int result = multiply(a, b);   
    printf("Result: %d\n", result);  
    return 0;
}
int multiply(int a, int b) {
    int result = 0;
    while (b != 0) { 
        if (b & 1) {
           result += a;
         } 
         a <<= 1;  // 左移相当于乘以2 
         b >>= 1;  // 右移相当于除以2
    }        
    return result;
}

汇编指令机械周期(简略)

x86架构中每条指令的执行周期数会因为具体的处理器型号和实现方式而有所不同,一般来说,加减乘除和位运算指令的执行周期数会根据操作数的长度、操作数类型、指令的复杂性等因素而有所差异。以下是大致的执行周期数估计:

1. 加法指令(ADD):   - 寄存器之间的加法指令大约需要1个周期。   - 内存和寄存器之间的加法指令可能需要2到3个周期。

2. 减法指令(SUB):   - 寄存器之间的减法指令大约需要1个周期。   - 内存和寄存器之间的减法指令可能需要2到3个周期

3. 乘法指令
(MUL):   - 8位乘法指令需要3到4个周期。   - 16位乘法指令需要9到12个周期。   - 32位乘法指令需要9到12个周期。   - 64位乘法指令需要15到20个周期。

4. 除法指令(DIV):   - 8位除法指令需要15到90个周期。   - 16位除法指令需要22到120个周期。   - 32位除法指令需要30到180个周期。   - 64位除法指令需要60到360个周期。

5. 位运算指令:   - 与运算(AND)、或运算(OR)、异或运算(XOR)等简单的位运算指令通常需要1个周期。   - 取反运算(NOT)指令也通常需要1个周期。   - 左移运算(SHL/SHLD)和右移运算(SHR/SHRD)指令通常需要1到2个周期。需要注意的是,这些周期数仅供参考,实际执行周期数会因为处理器的具体实现、操作数的类型和长度、相关的数据依赖等因素而有所不同。因此,在编写高性能的汇编代码时,应该尽量减少指令的数量和复杂度,避免不必要的数据依赖和内存访问,以提高程序的执行效率

相关链接
mul(乘法汇编)https://blog.csdn.net/wyyy2088511/article/details/126271047

加减乘除位运算https://blog.csdn.net/YPJMFC/article/details/78246971

乘法位运算https://blog.csdn.net/sxhlovehmm/article/details/46546283

位运算汇编指令https://blog.csdn.net/weixin_45437521/article/details/109174821

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值