1. 汇编的风格
- 1.1 intel 风格
指令 目的, 源
opcode destination, source
- 1.2 AT & T 风格
指令 源, 目的
opcode source, destination
2 简单示例
// 代码1
int square(int num) {
return num * num;
}
int main() {
int i = 4;
int j = square(i);
}
square(int):
push rbp //push rbp 和mov rbp, rsp又叫做函数的序言(prologue),几乎每个函数一开始都会有的指令。入栈, 出栈
mov rbp, rsp // rbp栈底, rsp栈顶, 旧的栈顶成为栈底
mov DWORD PTR [rbp-4], edi //edi是入参的计数器
mov eax, DWORD PTR [rbp-4] //eax是返回值的寄存器, PTR 是指针
imul eax, eax //
pop rbp
ret
main:
push rbp
mov rbp, rsp
sub rsp, 16 // 减少16
mov DWORD PTR [rbp-4], 4
mov eax, DWORD PTR [rbp-4]
mov edi, eax
call square(int) //执行square函数
mov DWORD PTR [rbp-8], eax //返回值放入
mov eax, 0
leave
ret
如下图,
3、 数据的传递
- 从内存到寄存器
- 从寄存器到内存
- 从立即数到寄存器,
- 从立即数到内存
数据不能从内存直接传递到内存。如果需要从内存传递到内存,要以寄存器为中介。
3.1指令集区别
一个word是两个字节,double words 两个字节
- intel
mov DWORD PTR [rbp-4], 4 //4指4个字节
- AT & T
movl $4, -4(%rbp) //%前缀表示寄存器,$表示立即数,()表示内存
4 常用寄存器
4.1 被调用方寄存器
寄存器 | 作用 | |
---|---|---|
rax(eax) | 返回值 | |
rdi | 第一个参数 | |
rsi | 第二个参数 | |
rdx | 第三个参数 | |
rcx | 第四个参数 | |
r8 | 第五个参数 | |
r9 | 第六个参数 | |
进入下一个函数的时候, 需要寄存器写入 |
rax和eax中, r对应8byte, e对应4byte
4.2 调用方寄存器
寄存器 | 作用 | |
---|---|---|
rsp | 栈顶指针 | |
rbx | 临时变量 | |
rbp | 栈基 | |
r5-r15 | 临时变量 | |
进入下一个函数, 需要在函数内保存这些值, 被调用函数返回时候, 需要恢复 |
4.3 其他
寄存器 | 作用 | |
---|---|---|
rip | 存储下一个执行的指令 | |
eflags | flags和结果判断的标志位 | |
xmm0 | 用来传递第一个double参数 | |
xmm1 | 用来传递第二个double参数 | 长度比较长 |
5. 控制
5.1 判断
汇编2
cmpl $6, -8(%rbp) // 比较, cmpl指令
jle .L4 // 满足小于条件 跳转.L4// jle指令
movl -8(%rbp), %eax
addl %eax, %eax
movl %eax, %esi
movl $_ZSt4cout, %edi
call std::basic_ostream<char, std::char_traits<char> >::operator<<(int)
jmp .L5 //jm指令
.L4:
movl -8(%rbp), %edx
movl %edx, %eax
addl %eax, %eax
addl %edx, %eax
movl %eax, %esi
movl $_ZSt4cout, %edi
call std::basic_ostream<char, std::char_traits<char> >::operator<<(int)
.L5:
movl $0, %eax
leave
ret
6. arm neon
1. armv7中的寄存器
16个通用寄存器(32bit),R0-R15
16个NEON寄存器(128bit),Q0-Q15(同时也可以被视为32个64bit的寄存器,D0-D31)
16个VFP寄存器(32bit),S0-S15
标签:汇编,int,mov,rbp,学习,eax,寄存器,PTR From: https://www.cnblogs.com/WillingCPP/p/16729796.htmlNEON和VFP的区别在于VFP是加速浮点计算的硬件不具备数据并行能力,同时VFP更尽兴双精度浮点数(double)的计算,NEON只有单精度浮点计算能力。
// android-ndk-r11c中armv7的arm_neon.h
NEON是一种SIMD(Single Instruction Multiple Data)指令,也就是说,NEON可以把若干源(source)操作数(operand)打包放到一个源寄存器中,对他们执行相同的操作,产生若干目的(dest)操作数,这种方式也叫向量化(vectorization)。