當(dāng)前位置:
首頁 >
0基础学习ios开发笔记第二天
發(fā)布時(shí)間:2025/6/17
32
豆豆
生活随笔
收集整理的這篇文章主要介紹了
0基础学习ios开发笔记第二天
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
c語言的入口函數(shù)是main函數(shù)。
main函數(shù)的返回值行業(yè)標(biāo)準(zhǔn)是int
return 數(shù)字;返回值
每條語句最后以分號(hào)結(jié)尾
注釋:行注釋、塊注釋
int main(void) {// line comment/** block comment * block comment*/ }數(shù)據(jù)類型就是訪問內(nèi)存的方式
在64位機(jī)器上查看如下數(shù)據(jù)類型的內(nèi)存訪問方式:
int main(void) {char ci = 8; // 1個(gè)字節(jié),8位,BYTEchar csum = ci + 8;short si = 16; // 2個(gè)字節(jié),16位,WORDshort sum = si + 16;int ii = 32; // 4個(gè)字節(jié),32位,DWORD (double word)int isum = ii + 32;long long li = 64; // 8個(gè)字節(jié),64位,QWORD (quater word)long long lsum = li + 64; } 使用命令 objdump -d -M interl a.out 按intel的匯編指令格式查看反匯編結(jié)果如下: 4004ed: 55 push rbp4004ee: 48 89 e5 mov rbp,rsp4004f1: c6 45 e2 08 mov BYTE PTR [rbp-0x1e],0x84004f5: 0f b6 45 e2 movzx eax,BYTE PTR [rbp-0x1e] ; 把8位數(shù)據(jù)復(fù)制到32寄存器,位數(shù)不夠的用0填充4004f9: 83 c0 08 add eax,0x84004fc: 88 45 e3 mov BYTE PTR [rbp-0x1d],al ; 把eax的低8位數(shù)據(jù)復(fù)制到棧4004ff: 66 c7 45 e4 10 00 mov WORD PTR [rbp-0x1c],0x10 400505: 0f b7 45 e4 movzx eax,WORD PTR [rbp-0x1c] ; 把16位數(shù)據(jù)復(fù)制到32寄存器,位數(shù)不夠的用0填充400509: 83 c0 10 add eax,0x1040050c: 66 89 45 e6 mov WORD PTR [rbp-0x1a],ax ; 把eax的低16位數(shù)據(jù)復(fù)制到棧400510: c7 45 e8 20 00 00 00 mov DWORD PTR [rbp-0x18],0x20400517: 8b 45 e8 mov eax,DWORD PTR [rbp-0x18] ; 把32位數(shù)據(jù)復(fù)制到32位寄存器40051a: 83 c0 20 add eax,0x2040051d: 89 45 ec mov DWORD PTR [rbp-0x14],eax400520: 48 c7 45 f0 40 00 00 mov QWORD PTR [rbp-0x10],0x40400527: 00 400528: 48 8b 45 f0 mov rax,QWORD PTR [rbp-0x10] ; 把8個(gè)字節(jié)的數(shù)據(jù)復(fù)制到rax寄存器,rax是64位寄存器40052c: 48 83 c0 40 add rax,0x40400530: 48 89 45 f8 mov QWORD PTR [rbp-0x8],rax400534: 5d pop rbp
?
寫如下程序觀察指針
#include <stdio.h>int main() {int x = 257;char y ='k';int *p = &x;printf("pointer lenth is %ld\n", sizeof(p));printf("*p is %d\n", *p);printf("p is %lx\n", p);printf("%p\n", &x);printf("%p\n", &y);printf("%p\n", &p); }
編譯程序時(shí)加上-g參數(shù)可以加入調(diào)試符號(hào)信息,同時(shí)objdump -S的時(shí)候也可以把反匯編代碼和C源碼對(duì)應(yīng)起來
使用命令
查看反匯編代碼部分如下:
typedef int * int_p; int main() {40052d: 55 push rbp40052e: 48 89 e5 mov rbp,rsp400531: 48 83 ec 10 sub rsp,0x10int x = 257; 400535: c7 45 f4 01 01 00 00 mov DWORD PTR [rbp-0xc],0x101 ; 4字節(jié)大小的數(shù)據(jù)會(huì)對(duì)齊到能整除4的內(nèi)存地址上char y ='k'; 40053c: c6 45 f3 6b mov BYTE PTR [rbp-0xd],0x6b ; char為1字節(jié),所以沒有對(duì)齊的要求int *p = &x; 400540: 48 8d 45 f4 lea rax,[rbp-0xc] ; 將x的地址放到rax寄存器400544: 48 89 45 f8 mov QWORD PTR [rbp-0x8],rax ; 再放到p變量中?
內(nèi)存布局如下圖:
轉(zhuǎn)載于:https://www.cnblogs.com/turing-apple/p/4912937.html
總結(jié)
以上是生活随笔為你收集整理的0基础学习ios开发笔记第二天的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微软算法100题26 左旋转字符串
- 下一篇: 教你如何更改xshell中的转发规则