在下面的代码中,我找到两个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);
}