初见

iOS arm64常用汇编

2020-05-22  本文已影响0人  下班买鸡蛋

1.寄存器

通用寄存器

   (1)64bit: x0-x28

   (2)32bit:w0-w28(属于x0-x28低32bit)

   (3)x0-x7通常用来存放函数的参数,更多的参数使用堆栈来传递

   (4)x0通常作为函数返回值

程序计数器

pc(Program Counter)    

记录CPU当前执行的是哪一条指令

存储着当前CPU正在执行的指令地址

类似于8086汇编的ip寄存器

堆栈指针

链接寄存器

lr(Link Register), 也就是x30

存储着函数的返回地址

程序状态寄存器

cpsr(current program status register)

2.指令

    (1)ret:返回

            将lr(x30)寄存器的值赋值给pc

    (2)mov:全称move,把后面内容的移动到前面寄存器

        mov x0, #0x8

    (3)add:将后面x0+x1,赋给x2

        mov x0, #0x1

        mov x1, #0x2

        add x2,  x0, x1

    (4)sub:将后面x0-x1,赋给第x2

        mov x0, #0x5

        mov x1, #0x2

        sub x2,  x0, x1

    (5)cmp:比较指令,x0 - x1,并根据结果设置CPSR的标志位

        mov x0, #0x3

        mov x1, #0x1

        cmp x0, x1

    (6)b:跳转指令,b直接跳转到mycode对应的地址

        b(条件) 目标地址

        b mycode

        mov x0, #0x5

        mycode:

        mov x1, #0x6

    (7) bl:带返回的跳转指令

         bl(条件) 目标地址 (类似函数调用)

        执行的操作:(1)将下一条指令的地址存储到lr(x30)寄存器中(2)跳转到标记处,执行代码

    (8)ldr:从内存中读取数据

        ldr x0, [x1]     ;(x1里面存的是地址 取出一定大小的数据  数据大小取决于x0的大小)

        ldr x0, [x1, #0x4]  (取x1中存的地址  加上立即数0x4  , 最终地址中的数据  赋给x0)

        ldr x0, [x1, #0x4]!    ;(同上  多了一个 x1中的地址值  等于最终地址值)

    (9)ldur:去内存中的数据放到寄存器

        ldur x0, [x1, #-0x4]        ;立即数为负

    (10)ldp:从内存中读取数据,放到一对寄存器中(p是pair的简称,一对的意思)

        ldp w0, w1, [x1, #0x4]    

    (11)str:往内存中写入数据

        str w0,[x1, #0x4]      ;把w0寄存器中的数据放到x1内存中        

        stur w0, [x1, #-0x4]

        stp w0, w1, [x1, #0x4]

    (12)条件域(跟在指令后并没有空格):bl:带返回的跳转指令

        EQ:equal,相等

        NE:not equal, 不相等

        GT:great than, 大于

        GE:great or equal, 大于等于

        LT:less than, 小于

        LE:less or equal, 小宇等于

        beq mycode(找CPSR中Z位 1就跳, 不是1 就不跳,也就是之前结果为0就跳) 

    (13)内存操作

3.堆栈

上一篇 下一篇

猜你喜欢

热点阅读