我對大小相同的兩個向量型別 double 的元素之和有疑問。代碼總是回傳 0。
#include <iostream>
using namespace std;
int main()
{
int n = 5;
double* tab = new double[n];
double* tab3 = new double[n];
for (size_t i = 0; i < n; i )
{
tab[i] = 1;
tab3[i] = 1;
}
double sum;
__asm {
mov eax, n; //vector size
mov edi, tab; //first vector
mov esi, tab3; //second vector
fldz;
l:
fadd[edi 8 * eax - 8];
fadd[esi 8 * eax - 8];
dec eax;
jnz l;
fstp sum;
}
cout << sum;
}
uj5u.com熱心網友回復:
遺憾的是我不在 Windows 上,所以我不得不修改代碼以使用 g 而不是 msvc,但我也使用了 intel 語法匯編。在除錯程序中,發現fadd指令沒有效果。我通過在andqword ptr之前添加來修復它,告訴匯編器使用指向 8 位元組值的指標(因為您使用的是而不是):[edi 8 * eax - 8][esi 8 * eax - 8]doublefloat
fadd qword ptr [edi 8 * eax - 8];
fadd qword ptr [esi 8 * eax - 8];
uj5u.com熱心網友回復:
所以你正在為這段 C 代碼尋找 asm,對吧?https://godbolt.org/z/vbdfEb94s
#include <cstddef>
double add(double *a, double *b, std::size_t len) {
double sum = 0;
while (len-- > 0) {
sum = *a ;
sum = *b ;
}
return sum;
}
我(意思是 gcc)想出了這個 64 位的代碼:
add(double*, double*, unsigned long):
xor eax, eax
xorps xmm0, xmm0
.L3:
cmp rdx, rax
je .L1
addsd xmm0, QWORD PTR [rdi rax*8]
addsd xmm0, QWORD PTR [rsi rax*8]
inc rax
jmp .L3
.L1:
ret
這適用于 32 位 i386:
add(double*, double*, unsigned int):
push ebp
xor eax, eax
fldz
mov ebp, esp
mov ecx, DWORD PTR [ebp 8]
mov edx, DWORD PTR [ebp 12]
.L3:
cmp DWORD PTR [ebp 16], eax
je .L1
fadd QWORD PTR [ecx eax*8]
fadd QWORD PTR [edx eax*8]
inc eax
jmp .L3
.L1:
pop ebp
ret
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/484863.html
