0基础学习ios开发笔记第二天
生活随笔
收集整理的這篇文章主要介紹了
0基础学习ios开发笔记第二天
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
c語言的入口函數是main函數。
main函數的返回值行業標準是int
return 數字;返回值
每條語句最后以分號結尾
注釋:行注釋、塊注釋
int main(void) {// line comment/** block comment * block comment*/ }數據類型就是訪問內存的方式
在64位機器上查看如下數據類型的內存訪問方式:
int main(void) {char ci = 8; // 1個字節,8位,BYTEchar csum = ci + 8;short si = 16; // 2個字節,16位,WORDshort sum = si + 16;int ii = 32; // 4個字節,32位,DWORD (double word)int isum = ii + 32;long long li = 64; // 8個字節,64位,QWORD (quater word)long long lsum = li + 64; } 使用命令 objdump -d -M interl a.out 按intel的匯編指令格式查看反匯編結果如下: 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位數據復制到32寄存器,位數不夠的用0填充4004f9: 83 c0 08 add eax,0x84004fc: 88 45 e3 mov BYTE PTR [rbp-0x1d],al ; 把eax的低8位數據復制到棧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位數據復制到32寄存器,位數不夠的用0填充400509: 83 c0 10 add eax,0x1040050c: 66 89 45 e6 mov WORD PTR [rbp-0x1a],ax ; 把eax的低16位數據復制到棧400510: c7 45 e8 20 00 00 00 mov DWORD PTR [rbp-0x18],0x20400517: 8b 45 e8 mov eax,DWORD PTR [rbp-0x18] ; 把32位數據復制到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個字節的數據復制到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); }
編譯程序時加上-g參數可以加入調試符號信息,同時objdump -S的時候也可以把反匯編代碼和C源碼對應起來
使用命令
查看反匯編代碼部分如下:
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字節大小的數據會對齊到能整除4的內存地址上char y ='k'; 40053c: c6 45 f3 6b mov BYTE PTR [rbp-0xd],0x6b ; char為1字節,所以沒有對齊的要求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變量中?
內存布局如下圖:
轉載于:https://www.cnblogs.com/turing-apple/p/4912937.html
總結
以上是生活随笔為你收集整理的0基础学习ios开发笔记第二天的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微软算法100题26 左旋转字符串
- 下一篇: 教你如何更改xshell中的转发规则