數組反組譯碼形式

來源:互聯網
上載者:User

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 /> 

哎,發現這東西變化多端..記這些死的東西一點兒作用都沒有,講究的還得得是靈活運用

繼續奮鬥努力中...............

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.