如何使用gcc asm将前一个进位加到64位加法中

时间:2017-10-13 17:41:14

标签: gcc assembly x86-64 inline-assembly addition

在下面的代码中,我找到两个64位数字a和b来得到总和和进位。它的工作。但是现在我想改变这样我也可以在这个总和中添加一个前一个进位并获得总结果并随身携带。在我的情况下formercarry说1,所以我想要a+b+formercarry = result + carry。 我试过但无法使用gcc asm访问formercarry值。我想我不太确定%2%3%1在asm代码中使用什么。有人可以提出任何建议吗?我希望答案是结果=0x4B100361BFB66EB2和carry = 1

#include<stdio.h>
#include<stdlib.h>
#include<stdint.h>

void add64(int carry,uint64_t a, uint64_t b, uint64_t *d, int *c)
{
    *c=0;
    char carry1;
     __asm__("mov %2,%%rax\n\t"
             "adc %3,%%rax\n\t"
             "setc %1\n\t"
             "mov %%rax,%0\n\t"
              :"=r"(*d),"=r"(carry1)
              :"r"(a),"r"(b)
              :"%rax");
    if (carry1)
        *c=1;
    else 
        *c=0;
}

int main()
{
    uint64_t a=0xA234BDFA12CD4379, b=0xA8DB4567ACE92B38;
    uint64_t result;
    int carry;
    int formercarry = 1;
    c1 = cpucycles();
    add64(formercarry, a, b, &result, &carry);
    printf("Sum = %lx,carry= %d\n", result, carry);
}

0 个答案:

没有答案