x86-64指令集128位乘法和除法实现

两个64位整数相乘得到的乘积需要128位来表示,x86-64指令集提供两个指令用于无符号乘法和有符号乘法,如下:

imulq S :R[%rdx] : R[%rax] <-- S * R[%rax]

mulq S :R[%rdx] : R[%rax] <-- S * R[%rax]

imulq用于实现有符号乘法,mulq用于实现无符号乘法,其余操作相同,将rax寄存器中保存的64位整数和给定操作数S相乘,得到一个128位的结果,其中高64位放在rdx寄存器中,低64位放在rax寄存器中,一个例子:

#include <inttypes.h>

typedef unsigned __int128 uint128_t;

void func(uint128_t *dest, uint64_t x, uint64_t y) {
    *dest = x * (uint128_t)y;
}

这里inttypes.h提供了对uint64_t的支持,表示无关机器类型的64位无符号数,但是没有关于128位的扩展,因此这里使用的是gcc提供的128位整数支持,查看汇编指令如下:

func:
	movq	%rsi, %rax
	mulq	%rdx
	movq	%rax, (%rdi)
	movq	%rdx, 8(%rdi)
	ret

这里先将x放到rax寄存器中,然后和rdx寄存器中保存的y相乘,mulq指令将低64位放在rax中,高64位放在rdx中,最后通过两个mov指令放在rdi寄存器中保存的地址开始的16位地址中

除法和乘法类型,指令为idivq

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值