天天看點

彙編語言_用彙編來了解C語言指針本質(1)

局部變量的存放位置

C語言代碼如下:

main()
{
    char a = 'a';
	char b = 'b';
	char c = 'c';

	int a1 = 0xa1;
	int a2 = 0xa2;
	int  a3 = 0xa3;

	char *offset_a = "1234567";
	char *offset_b = "abcdef";                          

}  
           

對應的彙編語言代碼如下:

彙編語言_用彙編來了解C語言指針本質(1)

可以看出,前六個變量都存放在棧中,因為是局部變量;而offset_a 和offset_b存放在棧中,但是對應的值存放在0194和019c中,通過檢視其記憶體,可以看到

1234567

和abcdef存放在ds:0194的資料段中。

彙編語言_用彙編來了解C語言指針本質(1)

全局變量和字元串存放位置

int x1,x2,x3;

main()
{
	
	char *offset_a = "1234567";
	char *offset_b = "abcdef";             

    char a = 'a';
	char b = 'b';
	char c = 'c';

	x1 = 0xa1;
	x2 = 0xa2;
	x3 = 0xa3;
	
} 
           

對應的彙編代碼如下:

彙編語言_用彙編來了解C語言指針本質(1)

可以看到

char *offset_a = "1234567";
char *offset_b = "abcdef";  
           

這兩個變量的值存放在段位址ds:0194和ds:019C中;而這兩個變量本身在棧中存放;

再看全局變量x1,x2,x3,

x1 = 0xa1;
	x2 = 0xa2;
	x3 = 0xa3;
           

這三個變量存放在

ds:01b6,ds:01b8,ds:01ba

的位置。

指針的實質

通過上面的分析,可以看到指針的實質就是位址,

char *offset_a = "1234567";

對應的彙編語言為:

mov word ptr [BP-8],0194

;

那就相當于,

char *offset_a = ds:0194

; 可以看出,指針就是在另一個位址存放某個位址。

繼續閱讀