我有一个函数可以在C中减去这样的3D向量:
inline void sub(float* a, float* b, float* r) {
r[0] = a[0] - b[0];
r[1] = a[1] - b[1];
r[2] = a[2] - b[2];
Visual Studio在调试反汇编中向我展示了以下第一次分配:
r[0] = a[0] - b[0];
0078BBA8 mov eax,4
0078BBAD imul ecx,eax,0
0078BBB0 mov edx,4
0078BBB5 imul eax,edx,0
0078BBB8 mov edx,dword ptr [a] <------ i guess: reading a[0]
0078BBBB mov esi,dword ptr [b]
0078BBBE movss xmm0,dword ptr [edx+ecx] <------ i guess: write a[0] to xmm0
0078BBC3 subss xmm0,dword ptr [esi+eax]
0078BBC8 mov eax,4
0078BBCD imul ecx,eax,0
0078BBD0 mov edx,dword ptr [r]
0078BBD3 movss dword ptr [edx+ecx],xmm0
我作为汇编的新手,我不明白为什么以下行[a]
代替了a
:
0078BBB8 mov edx,dword ptr [a]
我本来希望edx
我们应该拥有指针地址本身而不是指针处的值,因为以下几行似乎从中的地址读取值edx
:
0078BBBE movss xmm0,dword ptr [edx+ecx]
有人可以给我提示为什么这可行吗?
这就是调试器显示函数反汇编的方式,但这有点令人误解:a
与C源代码中的东西不一样。实际指令,其被示出为mov edx, dword ptr [a]
IS
8B 55 08 mov edx, dword ptr [ebp+8]
a
用作ebp+8
简化阅读反汇编的名称。
由于这是32位代码,并且默认的调用约定在堆栈上传递了所有参数a
,因此它本身不能直接使用,因此必须首先从堆栈中读取它,这就是您所看到的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句