使用x86汇编的数组中的元素总和

问题描述 投票:0回答:1

我正在尝试将总和存储在edx寄存器中,但是输出显示为0。如何解决此问题?

int main() {

   float price[ ] = { 22.1, 34.44, 567.33, 2.45 };
   float sum = 0;


   __asm {

                        xor eax, eax; //counter
                        mov ebx, 4 //num elements in array
                        lea ecx, price //address of first element in array
                        xor edx, edx //store sum
                    L1 :
                        add edx, [ecx+eax*4]
                        cmp eax, ebx
                        je done

                        inc eax
                        jmp L1

                    done :
                        mov sum, edx    
   }

   cout << "sum= " << sum; 

   return 0
}
assembly visual-c++ x86 floating-point inline-assembly
1个回答
0
投票

add是整数加;您需要addss xmm0, [ecx+eax*4],并在末尾存储addss xmm0, [ecx+eax*4]。在循环之前用movss将xmm0清零,就像使用xorps xmm0,xmm0将整数寄存器清零一样。

((如果不确定,例如,在调试器中或在xor edx,edx上,请查看纯C ++循环中未经优化或经过轻微优化的编译器输出,以获取有关如何使用这些语法的语法的信息


通过将这四个位模式作为整数求和而得到的整数可能表示(作为Binary32 IEEE浮点数)非常小的https://godbolt.org/,恰好打印了float

如果需要全部详细信息,请在单步执行时使用调试器查看寄存器和变量值。

© www.soinside.com 2019 - 2024. All rights reserved.