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中的转发规则