【发布时间】:2019-12-18 02:31:50
【问题描述】:
我想通过内联汇编器操作在 C++ 上创建的数组,当我尝试使用一维数组时它可以正常工作,但是当我使用多维数组时,我总是得到一个零。
我正在使用 Visual Studio 2019。
#include <iostream>
using namespace std;
int main()
{
double matrix[2][2] = { {10, 20},{30, 40} };//I always get a Zero
//double matrix[2] = { 50, 60 };//It works
double temp = 987;
_asm {
mov esi, 0
finit
; fld[matrix]
fld matrix[esi]
fstp temp
fwait
}
cout << "temp: " << temp << endl;
return 0;
}
我应该怎么做才能获得 30?
非常感谢您!
【问题讨论】:
-
你的数组如果是 8 字节 (QWORD) 的 DOUBLE。您需要使用 QWORD 覆盖加载或
fld尝试将其读取为 4 字节 FLOAT。fld qword ptr matrix[esi]。如果你想要二维数组的第三个元素,你可以加载值为 16 的 ESI。第一个元素 (DOUBLE) 为 0,第二个元素为 8,第三个元素为 16,第四个元素为 24 等。每个元素为 8 个字节在大小上,您需要传递元素的 BYTE 偏移量。您也可以使用fld qwiord ptr matrix[16]来获取第三个元素,即值 30.0 -
谢谢!!,我会用你的解决方案编辑问题。
-
不,不要用解决方案编辑问题。创建一个实际的答案并将解决方案放在那里。允许并鼓励您为自己的问题写下答案。
-
现在是 2019 年,你真的需要使用 legacy x87 来兼容 Pentium 4 / AMD K8 之前的 CPU 吗?
movsd xmm0, [mem]更简单、更高效。通常只使用 x87 来利用对 80 位 FP 的硬件支持。 -
感谢您的评论,我刚从 asm 开始,我试图在阅读一本严肃的书之前解决非常简单的问题。
标签: arrays visual-c++ x86 inline-assembly