linux如何转汇编,有懂汇编的么,求几个汇编转C的实现。

我们需要将大数(big number)运算移植到ARM STM32开发板,就从OpenSSL(1.1.1g)源代码中抠出了big number相关实现,但是有几个函数是汇编实现,无法移植到STM32开发板(也不知道STM32怎么用汇编),哪位大侠能将这几个汇编转成C函数? 也不知道复杂不复杂,愿意出100元求答案,也可以加我微信EarthChairman单聊。

【说明】BN_ULONG 类型为uint64_t,由于ARM STM32开发板不支持uint128_t,所以有些用C定义uint128_t的变量来实现是不行的。

# define mul_add(r,a,word,carry) do {   \

register BN_ULONG high,low;     \

asm ("mulq %3"                  \

: "=a"(low),"=d"(high)  \

: "a"(word),"m"(a)      \

: "cc");                \

asm ("addq %2,%0; adcq %3,%1"   \

: "+r"(carry),"+d"(high)\

: "a"(low),"g"(0)       \

: "cc");                \

asm ("addq %2,%0; adcq %3,%1"   \

: "+m"(r),"+d"(high)    \

: "r"(carry),"g"(0)     \

: "cc");                \

carry=high;                     \

} while (0)

# define mul(r,a,word,carry) do {       \

register BN_ULONG high,low;     \

asm ("mulq %3"                  \

: "=a"(low),"=d"(high)  \

: "a"(word),"g"(a)      \

: "cc");                \

asm ("addq %2,%0; adcq %3,%1"   \

: "+r"(carry),"+d"(high)\

: "a"(low),"g"(0)       \

: "cc");                \

(r)=carry, carry=high;          \

} while (0)

# define sqr(r0,r1,a)                   \

asm ("mulq %2"                  \

: "=a"(r0),"=d"(r1)     \

: "a"(a)                \

: "cc");

#define mul_add_c(a,b,c0,c1,c2) do {  \

BN_ULONG t1,t2;                 \

asm ("mulq %3"                  \

: "=a"(t1),"=d"(t2)     \

: "a"(a),"m"(b)         \

: "cc");                \

asm ("addq %3,%0; adcq %4,%1; adcq %5,%2"       \

: "+r"(c0),"+r"(c1),"+r"(c2)            \

: "r"(t1),"r"(t2),"g"(0)                \

: "cc");                                \

} while (0)

#define sqr_add_c(a,i,c0,c1,c2) do {  \

BN_ULONG t1,t2;                 \

asm ("mulq %2"                  \

: "=a"(t1),"=d"(t2)     \

: "a"(a[i])             \

: "cc");                \

asm ("addq %3,%0; adcq %4,%1; adcq %5,%2"       \

: "+r"(c0),"+r"(c1),"+r"(c2)            \

: "r"(t1),"r"(t2),"g"(0)                \

: "cc");                                \

} while (0)

#define mul_add_c2(a,b,c0,c1,c2) do { \

BN_ULONG t1,t2;                 \

asm ("mulq %3"                  \

: "=a"(t1),"=d"(t2)     \

: "a"(a),"m"(b)         \

: "cc");                \

asm ("addq %3,%0; adcq %4,%1; adcq %5,%2"       \

: "+r"(c0),"+r"(c1),"+r"(c2)            \

: "r"(t1),"r"(t2),"g"(0)                \

: "cc");                                \

asm ("addq %3,%0; adcq %4,%1; adcq %5,%2"       \

: "+r"(c0),"+r"(c1),"+r"(c2)            \

: "r"(t1),"r"(t2),"g"(0)                \

: "cc");                                \

} while (0)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值