汇编基础
编程语言的发展
-
机器语言
由0和1组成 -
汇编语言( Assembly Language )
用符号代替了0和1 ,比机器语言便于阅读和记忆 -
高级语言
C\C+ +\Java\JavaScript\Python等,更接近人类自然语言 -
操作:将寄存器BX的内容送入寄存器AX
1、机器语言: 1000100111011000
2、汇编语言: movw %bx, %ax
3、高级语言: ax= bx;
-
汇编语言与机器语言一一对应,每一条机器指令都有与之对应的汇编指令
-
汇编语言可以通过编译得到机器语言,机器语言可以通过反汇编得到汇编语言
-
高级语言可以通过编译得到汇编语言\机器语言,但汇编语言机器语言几乎不可能还原成高级语言
-
汇编语言的种类:
1、8086汇编 (16bit)
2、x86汇编(32bit)
3、x64汇编(64bit)
4、ARM汇编(嵌入式、移动设备)
5、....... -
x86、 x64汇编根据编译器的不同,有2种书写格式
1、Intel : Windows派系
2、AT&T : Unix派系 -
作为iOS开发工程师,最主要的汇编语言是
1、AT&T汇编-> iOS模拟器
2、ARM汇编-> iOS真机设备
常见汇编指令
图片.pngAT&T汇编和Intel汇编语法虽然有些不同,但是看起来还是挺接近的。
AT&T汇编指令后面跟的b、s、w、l、q、t等字母表示的是操作数长度,b=1字节,s=2字节或4字节,w=2字节,l=4字节或8字节,q=8字节,t=10字节
寄存器
-
有16个常用寄存器
%rax、 %rbx、 %rcx、 %rdx、 %rsi、 %rdi、 %rbp、 %rsp
%r8、 %r9、 %r10、 %r11、 %r12、 %r13、 %r14、 %r15 -
寄存器大小
1、r开头的寄存器都是64位8字节的
2、e开头的寄存器是32位4字节的
3、ax、bx、cx寄存器都是16位2字节的
4、l和h结尾的结存器是8位1字节的 -
寄存器的具体用途
1、%rax、%rdx常作为函数返回值使用
2、%rdi、 %rsi、 %rdx、 %rcx、 %r8、 %r9等寄存器常用于存放函数参数,当函数参数过多寄存器不够用的时候,就把参数存放在栈空间,紧挨着函数。
3、%rsp、 %rbp用于栈操作
寄存器的兼容性
寄存器兼容.png- 64位的寄存器会将自己的一半低0-31位用来作为32位寄存器
- 64位的寄存器会将自己的一半的一半低0-15位用来作为16位寄存器
- 64位的寄存器会将自己的0-7位用来作为低8位寄存器,8-15位用来作为高8位寄存器
规律
- 内存地址格式为: 0x4bdc(%rip) , 一般是全局变量,全局区(数据段)
- 内存地址格式为: -0x78(%rbp) , 一般是局部变量,栈空间
- 内存地址格式为: 0x10(%rax) ,一般是堆空间