插入一个 `__asm__` 块以对非常大的数字进行加法
Insert an `__asm__` block to do a addition in very large numbers
我正在做一个程序,此时我需要让它变得高效。
我正在使用 Haswell 微体系结构(64 位)和 'g++'。
objective 使用了 ADC
指令,直到循环结束。
//I removed every carry handlers from this preview, yo be more simple
size_t anum = ap[i], bnum = bp[i];
unsigned carry;
// The Carry flag is set here with an common addtion
anum += bnum;
cnum[0]= anum;
carry = check_Carry(anum, bnum);
for (int i=1; i<n; i++){
anum = ap[i];
bnum = bp[i];
//I want to remove this line and insert the __asm__ block
anum += (bnum + carry);
carry = check_Carry(anum, bnum);
//This block is not working
__asm__(
"movq -64(%rbp), %rcx;"
"adcq %rdx, %rcx;"
"movq %rsi, -88(%rbp);"
);
cnum[i] = anum;
}
CF
是否在第一次加法时设置只?还是每次我执行 ADC
指令时?
我认为问题出在 CF
的 loss 上,每次 loop 完成。如果是这个问题我该如何解决?
您在 gcc 系列编译器中这样使用 asm:
int src = 1;
int dst;
asm ("mov %1, %0\n\t"
"add , %0"
: "=r" (dst)
: "r" (src));
printf("%d\n", dst);
也就是说,您可以引用变量,而不是猜测它们在 memory/registers 中的位置。
[编辑] 关于进位的主题:尚不完全清楚您想要什么,但是:ADC
将 CF
作为输入并将其作为输出生成。但是,许多其他指令与标志混为一谈(例如编译器可能用来构造您的 for 循环的指令),因此您可能需要使用一些指令来 save/restore CF(可能 LAHF/SAHF
).
我正在做一个程序,此时我需要让它变得高效。
我正在使用 Haswell 微体系结构(64 位)和 'g++'。
objective 使用了 ADC
指令,直到循环结束。
//I removed every carry handlers from this preview, yo be more simple
size_t anum = ap[i], bnum = bp[i];
unsigned carry;
// The Carry flag is set here with an common addtion
anum += bnum;
cnum[0]= anum;
carry = check_Carry(anum, bnum);
for (int i=1; i<n; i++){
anum = ap[i];
bnum = bp[i];
//I want to remove this line and insert the __asm__ block
anum += (bnum + carry);
carry = check_Carry(anum, bnum);
//This block is not working
__asm__(
"movq -64(%rbp), %rcx;"
"adcq %rdx, %rcx;"
"movq %rsi, -88(%rbp);"
);
cnum[i] = anum;
}
CF
是否在第一次加法时设置只?还是每次我执行 ADC
指令时?
我认为问题出在 CF
的 loss 上,每次 loop 完成。如果是这个问题我该如何解决?
您在 gcc 系列编译器中这样使用 asm:
int src = 1;
int dst;
asm ("mov %1, %0\n\t"
"add , %0"
: "=r" (dst)
: "r" (src));
printf("%d\n", dst);
也就是说,您可以引用变量,而不是猜测它们在 memory/registers 中的位置。
[编辑] 关于进位的主题:尚不完全清楚您想要什么,但是:ADC
将 CF
作为输入并将其作为输出生成。但是,许多其他指令与标志混为一谈(例如编译器可能用来构造您的 for 循环的指令),因此您可能需要使用一些指令来 save/restore CF(可能 LAHF/SAHF
).