最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語(yǔ)言中的數(shù)組和指針匯編代碼分析實(shí)例

 更新時(shí)間:2015年06月03日 09:35:30   投稿:junjie  
這篇文章主要介紹了C語(yǔ)言中的數(shù)組和指針匯編代碼分析實(shí)例,本文用一則C語(yǔ)言例子來(lái)得到對(duì)應(yīng)的匯編代碼,并一一注解每句匯編代碼的含義,需要的朋友可以參考下

今天看《程序員面試寶典》時(shí)偶然看到講數(shù)組和指針的存取效率,閑著無(wú)聊,就自己寫了段小代碼,簡(jiǎn)單分析一下C語(yǔ)言背后的匯編,可能很多人只注重C語(yǔ)言,但在實(shí)際應(yīng)用當(dāng)中,當(dāng)出現(xiàn)問(wèn)題時(shí),有時(shí)候還是通過(guò)分析匯編代碼能夠解決問(wèn)題。本文只是為初學(xué)者,大??梢燥h過(guò)~

C源代碼如下:

復(fù)制代碼 代碼如下:

#include "stdafx.h"
int main(int argc, char* argv[])
{
       char a=1;
       char c[] = "1234567890";
       char *p = "1234567890";
       a = c[1];
       a = p[1];
       return 0;
}

在VC6.0下查看匯編代碼步驟:
在main函數(shù)中靠前的部分隨便一行F9設(shè)置斷點(diǎn)->編譯->F5 在調(diào)試界面中右鍵->Go to disassembly

Debug匯編代碼(已加注釋):

復(fù)制代碼 代碼如下:

4:    #include "stdafx.h"
5:
6:    int main(int argc, char* argv[])
7:    {
00401010   push        ebp    
00401011   mov         ebp,esp      ;保存棧幀
00401013   sub         esp,54h        ;抬高棧頂
00401016   push        ebx
00401017   push        esi
00401018   push        edi                     ;壓入程序中用到的寄存器,以便恢復(fù)
00401019   lea         edi,[ebp-54h]            
0040101C   mov         ecx,15h
00401021   mov         eax,0CCCCCCCCh
00401026   rep stos    dword ptr [edi]    ;棧頂與棧幀之間的數(shù)據(jù)填充為0xcc,相當(dāng)于匯編中的int 3,這是因?yàn)閐ebug模式下把Stack上的變量都初始化為0xcc,檢查未初始化的問(wèn)題
8:        char a=1;
00401028   mov         byte ptr [ebp-4],1      ;ebp-4是為變量a分配的空間地址
9:        char c[] = "1234567890";
0040102C   mov         eax,[string "1234567890" (0042201c)]
00401031   mov         dword ptr [ebp-10h],eax   ;“1234567890”是字符串常量,存儲(chǔ)在地址0042201c處,ebp-10是為數(shù)組C分配的空間的首地址,空間大小從ebp-0x10到ebp-0x04,共12個(gè)字節(jié)。本句中先把“1234”這4個(gè)字節(jié)拷貝到數(shù)組C中
00401034   mov         ecx,dword ptr [string "1234567890" 4 (00422020)]
0040103A   mov         dword ptr [ebp-0Ch],ecx  ;作用同上,把“5678”這4個(gè)字節(jié)拷貝到數(shù)組C中
0040103D   mov         dx,word ptr [string "1234567890" 8 (00422024)]
00401044   mov         word ptr [ebp-8],dx   ;作用同上,把“90”這2個(gè)字節(jié)拷貝到C中
00401048   mov         al,[string "1234567890" 0Ah (00422026)]
0040104D   mov         byte ptr [ebp-6],al    ;這個(gè)大家都熟,不要忘了\0
10:       char *p = "1234567890";
00401050   mov         dword ptr [ebp-14h],offset string "1234567890" (0042201c) ;ebp-0x14是為指針p分配的空間地址,大小是4個(gè)字節(jié),地址中的值是字符串“1234567890”的首地址
11:       a = c[1];
00401057   mov         cl,byte ptr [ebp-0Fh]  ;這里是重點(diǎn),因?yàn)閿?shù)組C在棧上連續(xù)存儲(chǔ),很容易根據(jù)ebp找到第其中一個(gè)字符的地址,并取值,賦給cl
0040105A   mov         byte ptr [ebp-4],cl     ;完成賦值
12:       a = p[1];
0040105D   mov         edx,dword ptr [ebp-14h]  ;這里與上面就有區(qū)別,因?yàn)楦鶕?jù)ebp只知道指針p的值,先得到p的值,即先得到一個(gè)指針
00401060   mov         al,byte ptr [edx 1]    ;根據(jù)得到的指針間接的找到字符串中的一個(gè)字符
00401063   mov         byte ptr [ebp-4],al
13:       return 0;
00401066   xor         eax,eax         ;eax清0,作為main函數(shù)的返回值
14:   }
00401068   pop         edi
00401069   pop         esi
0040106A   pop         ebx
0040106B   mov         esp,ebp
0040106D   pop         ebp     ;恢復(fù)ebp
0040106E   ret

好了,可以看到,用數(shù)組訪問(wèn)元素,只需2步,而用指針時(shí)要3步??梢姅?shù)組和指針并不相同,有時(shí)候大家都認(rèn)為可以把數(shù)組的名稱看成一個(gè)指針,這種想法有時(shí)候沒(méi)錯(cuò),但有時(shí)候卻會(huì)出錯(cuò)。我再舉一個(gè)簡(jiǎn)單的例子,而下面的這個(gè)例子可能是大家在開發(fā)過(guò)程中經(jīng)常會(huì)碰到的問(wèn)題。

在文件test.cpp中:

復(fù)制代碼 代碼如下:

#include "stdafx.h"
#include "inc.h"
extern char chTest[10];
int main(int argc, char* argv[])
{
       printf("chTest=%s\n", chTest);
       return 0;
}

上面有個(gè)extern聲明,表明chTest數(shù)組是在外部文件中定義過(guò)的。chTest定義在inc.h中:

復(fù)制代碼 代碼如下:

char chTest[10]="123456789";

上述的程序,經(jīng)編譯后,可以成功運(yùn)行。但如果把紅色的代碼改成如下:

復(fù)制代碼 代碼如下:

extern char *chTest;

這時(shí),程序在編譯的時(shí)候就會(huì)通不過(guò),提示的錯(cuò)誤信息是:redefinition; different types of indirection,但這時(shí)候并沒(méi)有錯(cuò)誤出現(xiàn)在哪一行的說(shuō)明,如果是在開發(fā)一個(gè)大型工程,那么就不容易定位問(wèn)題出在哪個(gè)地方。造成上述錯(cuò)誤的原因我想大家都明白了,就是因?yàn)楫?dāng)chTest作為一個(gè)指針被引用時(shí),其元素訪問(wèn)的方式與數(shù)組是不同的,就算程序能編譯通過(guò),在運(yùn)行時(shí),也是會(huì)出現(xiàn)錯(cuò)誤。

好了,上述的內(nèi)容都是個(gè)人有感而發(fā),是些簡(jiǎn)單零碎的東西,笑納。如有哪些地方說(shuō)的不合適,而望指正!

相關(guān)文章

  • Linux下g++編譯與使用靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)的方法

    Linux下g++編譯與使用靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)的方法

    下面小編就為大家?guī)?lái)一篇Linux下g++編譯與使用靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05
  • 在vs2010中,輸出當(dāng)前文件路徑與源文件當(dāng)前行號(hào)的解決方法

    在vs2010中,輸出當(dāng)前文件路徑與源文件當(dāng)前行號(hào)的解決方法

    本篇文章是對(duì)在vs2010中,輸出當(dāng)前文件路徑與源文件當(dāng)前行號(hào)的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • VC++中HTControl控件類的CHTSlider控制桿控件類簡(jiǎn)介

    VC++中HTControl控件類的CHTSlider控制桿控件類簡(jiǎn)介

    這篇文章主要介紹了VC++中HTControl控件類的CHTSlider控制桿控件類,需要的朋友可以參考下
    2014-08-08
  • opencv平均背景法詳解

    opencv平均背景法詳解

    這篇文章主要為大家詳細(xì)介紹了opencv平均背景法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • C++九種排序具體實(shí)現(xiàn)代碼

    C++九種排序具體實(shí)現(xiàn)代碼

    這篇文章主要介紹了C++九種排序具體實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • C語(yǔ)言實(shí)現(xiàn)手寫字符串處理工具的示例代碼

    C語(yǔ)言實(shí)現(xiàn)手寫字符串處理工具的示例代碼

    這篇文章主要為大家詳細(xì)介紹了利用C語(yǔ)言實(shí)現(xiàn)手寫字符串處理工具的相關(guān)資料,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下
    2022-09-09
  • C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單掃雷小程序

    C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單掃雷小程序

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單掃雷小程序,一款大眾類的益智小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • 帶你理解C語(yǔ)言中的漢諾塔公式

    帶你理解C語(yǔ)言中的漢諾塔公式

    大家好,本篇文章主要講的是帶你理解C語(yǔ)言中的漢諾塔公式,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • 一文詳解C語(yǔ)言操作符

    一文詳解C語(yǔ)言操作符

    這篇文章主要詳細(xì)介紹了C語(yǔ)言的操作符,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • c語(yǔ)言實(shí)現(xiàn)php的trim標(biāo)簽

    c語(yǔ)言實(shí)現(xiàn)php的trim標(biāo)簽

    本文給大家介紹的是使用C語(yǔ)言實(shí)現(xiàn)php的trim標(biāo)簽功能的代碼,非常的實(shí)用,其主要作用是清除字符串開頭結(jié)尾除空白,有需要的小伙伴可以參考下。
    2016-01-01

最新評(píng)論

维西| 辽宁省| 麻栗坡县| 云南省| 黄大仙区| 宁化县| 确山县| 嘉鱼县| 梧州市| 绿春县| 黄陵县| 曲周县| 西乌| 内丘县| 霍州市| 应用必备| 杭州市| 邵武市| 建湖县| 武清区| 盈江县| 五华县| 瓦房店市| 浑源县| 巧家县| 开远市| 连江县| 黔西| 施秉县| 荥阳市| 大埔区| 太康县| 台东市| 辰溪县| 北票市| 盐边县| 广宗县| 安阳县| 两当县| 吉安市| 溆浦县|