-
寄存器与内存
-
通常,CPU会先将内存中的数据存储到寄存器中,然后再对寄存器中的数据进行运算
-
假设内存中有块红色内存空间的值是3,现在想把它的值加1,并将结果存储到蓝色内存空间
-> CPU首先会将红色内存空间的值放到rax寄存器中:movq 红色内存空间, %rax
-> 然后让rax寄存器与1相加:addq $0x1, %rax
-> 最后将值赋值给内存空间:movq %rax, 蓝色内存空间
-
编程语言的发展
-
机器语言:由0和1组成
-
汇编语言(Assembly Language): 用符号代替了0和1,比机器语言便于阅读和记忆
-
高级语言:C\C++\Java\JavaScript\Python等,更接近人类自然语言
-
操作:将寄存器BX的内容送入寄存器AX
-> 机器语言: 1000100111011000
-> 汇编语言: movw %bx, %ax
-> 高级语言: ax = bx;
-
汇编语言与机器语言一一对应,每一条机器指令都有与之对应的汇编指令
-
汇编语言可以通过编译得到机器语言,机器语言可以通过反汇编得到汇编语言
-
高级语言可以通过编译得到汇编语言<font color=red>机器语言,但汇编语言<font color=red>机器语言几乎不可能还原成高级语言
-
汇编语言的种类
-
汇编语言的种类 p8086汇编(16bit) px86汇编(32bit) px64汇编(64bit) pARM汇编(嵌入式、移动设备) …
-
x86、x64汇编根据编译器的不同,有2种书写格式
– pIntel:Windows派系
– AT&T :Unix派系 -
作为iOS开发工程师,最主要的汇编语言是
– AT&T汇编 -> iOS模拟器
– ARM汇编 -> iOS真机设备 -
常见的汇编指令
- prax、rbx、rcx 、rdx、rsi、rdi、rbp、rsp
- r8、r9、r10、r11、r12、r13、r14、r15
- 寄存器的具体用途
- rax、rdx常作为函数返回值使用
- rdi、rsi、rdx、rcx、r8、r9等寄存器常用于存放函数参数
- rsp、rbp用于栈操作
- rip作为指令指针
-> ü 存储着CPU下一条要执行的指令的地址
-> ü 一旦CPU读取一条指令,rip会自动指向下一条指令(存储下一条指令的地址)
-
lldb常用指令
-
读取寄存器的值:
-pregister read/格式
-pregister read/x -
修改寄存器的值:
-register write 寄存器名称 数值
-register write rax 0 -
读取内存中的值:
-x/数量-格式-字节大小 内存地址
-x/3xw 0x0000010 -
修改内存中的值:
-memory write 内存地址 数值
-memory write 0x0000010 10 -
格式: x是16进制,f是浮点,d是十进制
-
字节大小:
-b – byte 1字节
-h – half word 2字节
-w – word 4字节
-g – giant word 8字节 -
expression 表达式
-可以简写:expr 表达式
-expression $rax
-expression $rax = 1 -
po 表达式
-
print 表达式
-po/x $ rax
-po (int)$ rax -
thread step-over、next、n
-单步运⾏行行,把子函数当做整体⼀一步执⾏行行(源码级别) -
thread step-in、step、s
-单步运⾏行行,遇到子函数会进⼊入子函数(源码级别) -
thread step-inst-over、nexti、ni
-单步运⾏行行,把子函数当做整体⼀一步执⾏行行(汇编级别) -
thread step-inst、stepi、si
-单步运⾏行行,遇到子函数会进⼊入子函数(汇编级别) -
thread step-out、finish
-直接执⾏行行完当前函数的所有代码,返回到上一个函数(遇到断点会卡住) -
规律
-
内存地址格式为:0x4bdc(%rip),一般是全局变量,全局区(数据段)
-
内存地址格式为:-0x78(%rbp),一般是局部变量,栈空间
-
内存地址格式为:0x10(%rax),一般是堆空间
本文章只是本人的学习笔记!