首页 > 编程语言 >汇编学习

汇编学习

时间:2022-09-26 11:23:32浏览次数:73  
标签:汇编 int mov rbp 学习 eax 寄存器 PTR

点我代码看汇编

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

NEON和VFP的区别在于VFP是加速浮点计算的硬件不具备数据并行能力,同时VFP更尽兴双精度浮点数(double)的计算,NEON只有单精度浮点计算能力。
// android-ndk-r11c中armv7的arm_neon.h
NEON是一种SIMD(Single Instruction Multiple Data)指令,也就是说,NEON可以把若干源(source)操作数(operand)打包放到一个源寄存器中,对他们执行相同的操作,产生若干目的(dest)操作数,这种方式也叫向量化(vectorization)。

标签:汇编,int,mov,rbp,学习,eax,寄存器,PTR
From: https://www.cnblogs.com/WillingCPP/p/16729796.html

相关文章