亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

C語言中的數組和指針匯編代碼分析實例

2020-01-26 15:05:49
字體:
來源:轉載
供稿:網友

今天看《程序員面試寶典》時偶然看到講數組和指針的存取效率,閑著無聊,就自己寫了段小代碼,簡單分析一下C語言背后的匯編,可能很多人只注重C語言,但在實際應用當中,當出現問題時,有時候還是通過分析匯編代碼能夠解決問題。本文只是為初學者,大牛可以飄過~

C源代碼如下:

復制代碼 代碼如下:

#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函數中靠前的部分隨便一行F9設置斷點->編譯->F5 在調試界面中右鍵->Go to disassembly

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

復制代碼 代碼如下:

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                     ;壓入程序中用到的寄存器,以便恢復
00401019   lea         edi,[ebp-54h]            
0040101C   mov         ecx,15h
00401021   mov         eax,0CCCCCCCCh
00401026   rep stos    dword ptr [edi]    ;棧頂與棧幀之間的數據填充為0xcc,相當于匯編中的int 3,這是因為debug模式下把Stack上的變量都初始化為0xcc,檢查未初始化的問題
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”是字符串常量,存儲在地址0042201c處,ebp-10是為數組C分配的空間的首地址,空間大小從ebp-0x10到ebp-0x04,共12個字節。本句中先把“1234”這4個字節拷貝到數組C中
00401034   mov         ecx,dword ptr [string "1234567890" 4 (00422020)]
0040103A   mov         dword ptr [ebp-0Ch],ecx  ;作用同上,把“5678”這4個字節拷貝到數組C中
0040103D   mov         dx,word ptr [string "1234567890" 8 (00422024)]
00401044   mov         word ptr [ebp-8],dx   ;作用同上,把“90”這2個字節拷貝到C中
00401048   mov         al,[string "1234567890" 0Ah (00422026)]
0040104D   mov         byte ptr [ebp-6],al    ;這個大家都熟,不要忘了/0
10:       char *p = "1234567890";
00401050   mov         dword ptr [ebp-14h],offset string "1234567890" (0042201c) ;ebp-0x14是為指針p分配的空間地址,大小是4個字節,地址中的值是字符串“1234567890”的首地址
11:       a = c[1];
00401057   mov         cl,byte ptr [ebp-0Fh]  ;這里是重點,因為數組C在棧上連續存儲,很容易根據ebp找到第其中一個字符的地址,并取值,賦給cl
0040105A   mov         byte ptr [ebp-4],cl     ;完成賦值
12:       a = p[1];
0040105D   mov         edx,dword ptr [ebp-14h]  ;這里與上面就有區別,因為根據ebp只知道指針p的值,先得到p的值,即先得到一個指針
00401060   mov         al,byte ptr [edx 1]    ;根據得到的指針間接的找到字符串中的一個字符
00401063   mov         byte ptr [ebp-4],al
13:       return 0;
00401066   xor         eax,eax         ;eax清0,作為main函數的返回值
14:   }
00401068   pop         edi
00401069   pop         esi
0040106A   pop         ebx
0040106B   mov         esp,ebp
0040106D   pop         ebp     ;恢復ebp
0040106E   ret

好了,可以看到,用數組訪問元素,只需2步,而用指針時要3步??梢姅到M和指針并不相同,有時候大家都認為可以把數組的名稱看成一個指針,這種想法有時候沒錯,但有時候卻會出錯。我再舉一個簡單的例子,而下面的這個例子可能是大家在開發過程中經常會碰到的問題。

在文件test.cpp中:

復制代碼 代碼如下:

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

上面有個extern聲明,表明chTest數組是在外部文件中定義過的。chTest定義在inc.h中:

復制代碼 代碼如下:

char chTest[10]="123456789";

上述的程序,經編譯后,可以成功運行。但如果把紅色的代碼改成如下:

復制代碼 代碼如下:

extern char *chTest;

這時,程序在編譯的時候就會通不過,提示的錯誤信息是:redefinition; different types of indirection,但這時候并沒有錯誤出現在哪一行的說明,如果是在開發一個大型工程,那么就不容易定位問題出在哪個地方。造成上述錯誤的原因我想大家都明白了,就是因為當chTest作為一個指針被引用時,其元素訪問的方式與數組是不同的,就算程序能編譯通過,在運行時,也是會出現錯誤。

好了,上述的內容都是個人有感而發,是些簡單零碎的東西,笑納。如有哪些地方說的不合適,而望指正!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美国产精品日韩| 久久成人亚洲精品| 欧美激情视频免费观看| 成人写真视频福利网| 欧美成人黑人xx视频免费观看| 亚洲天堂精品在线| 日韩免费看的电影电视剧大全| 亚洲qvod图片区电影| 亚洲欧美在线看| 亚洲精品短视频| 亚洲aaaaaa| 亚洲肉体裸体xxxx137| 国产精品久久久久久久电影| 红桃视频成人在线观看| 成人xxxxx| 欧美重口另类videos人妖| 91精品国产91久久久久福利| 中文字幕亚洲字幕| 久久久久久久国产精品| 久久人人看视频| 国产网站欧美日韩免费精品在线观看| 国产精品免费视频xxxx| 91超碰中文字幕久久精品| 亚洲黄色www| 国产色婷婷国产综合在线理论片a| 欧美电影电视剧在线观看| 国产成人综合精品| 欧美成年人视频| 欧美日韩亚洲激情| 国产成人精品视频在线观看| 亚洲美女喷白浆| 亚洲一区二区在线播放| 国产精品久久久久久婷婷天堂| 国产成人久久久| 九色成人免费视频| 中文欧美日本在线资源| 色噜噜狠狠狠综合曰曰曰88av| 欧美成人性色生活仑片| 成人午夜高潮视频| 久久在精品线影院精品国产| 国产精品91久久久久久| 欧美精品免费在线| 欧美日韩人人澡狠狠躁视频| 国产亚洲美女久久| 欧美中文字幕在线视频| 欧美成人自拍视频| 亚洲精品美女免费| 亚洲精品国产精品国自产在线| 中文字幕精品—区二区| 亚洲自拍小视频| 久久亚洲精品毛片| 北条麻妃久久精品| 国产精品国产三级国产aⅴ浪潮| 亚洲91av视频| 奇米一区二区三区四区久久| 欧美成人国产va精品日本一级| 黑人与娇小精品av专区| 亚洲成人教育av| 777777777亚洲妇女| 国产精品尤物福利片在线观看| 精品视频久久久| 黄色91在线观看| 91精品视频在线播放| 97色在线观看免费视频| 国产一区二区三区日韩欧美| 最近中文字幕mv在线一区二区三区四区| 成人深夜直播免费观看| 国产成人aa精品一区在线播放| www.欧美三级电影.com| 国产综合香蕉五月婷在线| 国产成人精品一区二区| 欧美日韩国产区| 97在线观看免费| 日韩av电影中文字幕| 亚洲国产日韩欧美在线99| 日韩黄在线观看| 亚洲美女精品成人在线视频| 久久免费精品日本久久中文字幕| 热久久视久久精品18亚洲精品| 亚洲偷熟乱区亚洲香蕉av| 黑人巨大精品欧美一区二区一视频| 欧美一级在线播放| 一区二区三区视频观看| 性夜试看影院91社区| 亚洲视频在线观看免费| 亚洲天堂av女优| 成人信息集中地欧美| 国产精品久久在线观看| 2019最新中文字幕| 国产精品99久久久久久白浆小说| 欧美大片欧美激情性色a∨久久| 国产成人精品a视频一区www| 久久久久久久久久国产精品| 国产欧美日韩中文字幕| 国外成人免费在线播放| 国产美女久久精品香蕉69| 日本欧美黄网站| 久久精品福利视频| 欧美又大又硬又粗bbbbb| 久久精品国产亚洲精品2020| 久久亚洲私人国产精品va| 2019精品视频| 97精品国产97久久久久久免费| 国产精品免费久久久久久| 日韩av色综合| 久久久久久久久久久免费精品| 精品国偷自产在线视频99| 91精品国产综合久久香蕉的用户体验| 欧美激情一区二区三区在线视频观看| 亚洲色图偷窥自拍| 欧美一区二区三区精品电影| 97在线视频免费| 日韩一区二区三区在线播放| 亚洲电影免费观看高清完整版在线| 中文字幕日韩免费视频| 国产亚洲欧洲在线| 一区二区三区四区精品| 日韩大陆欧美高清视频区| www.日韩不卡电影av| 精品国产一区二区三区久久狼5月| 欧美日韩国产丝袜美女| 久久久久这里只有精品| 久久精品国产亚洲精品2020| 欧美中文字幕视频在线观看| 日韩精品免费在线观看| 欧美乱大交做爰xxxⅹ性3| 国产精品免费一区| 久久综合色影院| 国产精品福利网站| 日韩av中文字幕在线播放| 欧美中文在线观看国产| 欧美福利视频在线| 中文字幕亚洲综合久久| 97高清免费视频| 久久精品国产精品亚洲| 亚洲片国产一区一级在线观看| 日韩在线视频免费观看| 亚洲国产欧美在线成人app| 国产精品午夜一区二区欲梦| 国产精品草莓在线免费观看| 色狠狠av一区二区三区香蕉蜜桃| 国产成人精品一区二区三区| 国产在线视频不卡| 中文字幕亚洲无线码在线一区| 欧美日韩一区二区三区在线免费观看| 久久色精品视频| 久久久精品一区二区| 亚洲性av在线| 日韩av不卡在线| 91av在线精品| 中文字幕亚洲一区| 欧美最猛性xxxxx(亚洲精品)| 国产精品永久免费视频| 国产精品看片资源| 91伊人影院在线播放| 日本一区二区在线免费播放| 久久这里只有精品视频首页| 日韩成人av在线播放| 日韩精品中文字幕在线| 最近免费中文字幕视频2019| 国产欧美日韩亚洲精品| 久久久精品久久| 亚洲成av人影院在线观看| 欧美一区二区视频97|