int Array[5]={1,2,3,4,5};<br />for (int i=0;i<5;i++)<br />{<br />Array[i]=i;<br />}
下標迴圈時用mov [ebp+ecx*4-14]的原因應該正是用變數作為下標定址
的話,用EBP-14後的地址就是第一個數組元素,ecx*4下標..
因為mov [ebp-14]與 mov [ebp+0*4-14]等價
mov [ebp-10]與mov [ebp+1*4-14]等價
這樣雖然看著複雜,但 也不過是因為用了變數作為下標元素而已
這種mov [ebp+ecx*4-14]的寫法是棧局部數組的定址方式 因為他用EBP作為基址必須減去他的大小14然後加上元素下標
如果是全域變數的話,
mov dword ptr ds:[ecx*4+434DC0],edx 他會是這種直接用常數作為基址的定址方式 ECX*4作為元素下標值
二維數組形式
Array[i][j]這種形式返回出來的代碼是 mov [edx+eax*4+基址]之所以這樣原因應該是下標都是可變的所以沒法子用常量
去定址
array[i][1]這種形式代碼被省略成為了 mov [edx+基址]但是這裡的基址他加上被搞成這樣的原因
應該是由於二維數組的列是常數,所以直接可直接在基址上加上列常數的大小,與一位元組狠類似
Array[2][j]這種行是常數但列是變數形式的反組譯碼格式如 mov [ecx*4+基址]這兒的基址同樣是常數行常數大小
他這兒只需要用[ecx*4]去定址列就可以了...
局部二維數組
13: Array[i][j]=i;<br />004010F3 mov edx,dword ptr [ebp-68h]<br />004010F6 imul edx,edx,14h<br />004010F9 lea eax,[ebp+edx-64h]<br />004010FD mov ecx,dword ptr [j]<br />00401100 mov edx,dword ptr [ebp-68h]<br />00401103 mov dword ptr [eax+ecx*4],edx<br />14: Array[i][1]=i;<br />00401106 mov eax,dword ptr [ebp-68h]<br />00401109 imul eax,eax,14h<br />0040110C mov ecx,dword ptr [ebp-68h]<br />0040110F mov dword ptr [ebp+eax-60h],ecx<br />15: Array[2][j]=i;<br />00401113 mov edx,dword ptr [j]<br />00401116 mov eax,dword ptr [ebp-68h]<br />00401119 mov dword ptr [ebp+edx*4-3Ch],eax<br />16: }<br />0040111D jmp main+0B4h (004010e4)<br />
哎,發現這東西變化多端..記這些死的東西一點兒作用都沒有,講究的還得得是靈活運用
繼續奮鬥努力中...............