ARM 汇编指令

文章目录

  • ARM64
    • 寄存器
    • 常规指令
    • 跳转指令
    • 异常指令
  • ARM32
    • 寄存器
    • gcc编译器属性
        • 1. __attribute__((naked))

ARM64

寄存器

  • x0 - x30 共31个通用寄存器,均为64bit,w0 - w30用来访问低32bit;
  • x29:用来充当FP,intel是ebp;
  • x30:充当lr寄存器,用来保存函数返回后的下一条执行地址;
  • SP:保存栈顶指针,使用 SP/WSP来进行对SP寄存器的访问,64bit,intel是esp;
  • PC:程序计数器,俗称PC指针,总是指向即将要执行的下一条指令,在arm64中,软件是不能改写PC寄存器的,64bit
  • CPSR:状态寄存器,64bit;

常规指令

ARM64指令长度是32bit。

  • MOV X1,X0 ;将寄存器X0的值传送到寄存器X1
  • ADD X0,X1,X2 ;寄存器X1和X2的值相加后传送到X0
  • SUB X0,X1,X2 ;寄存器X1和X2的值相减后传送到X0
  • AND X0,X0,#0xF ; X0的值与0xF相位与后的值传送到X0
  • ORR X0,X0,#9 ; X0的值与9相位或后的值传送到X0
  • EOR X0,X0,#0xF ; X0的值与0xF相异或后的值传送到X0
  • LDR X5,[X6,#0x08] ;X6寄存器加0x08的和的地址值内的数据传送到X5
    LDR X0, [X1] Load from the address in X1
    LDR X0, [X1, #8] Load from address X1 + 8
    LDR X0, [X1, X2] Load from address X1 + X2
    LDR X0, [X1, X2, LSL, #3] Load from address X1 + (X2 << 3)
    LDR X0, [X1, W2, SXTW] Load from address X1 + sign extend(W2)
    LDR X0, [X1, W2, SXTW, #3] Load from address X1 + (sign extend(W2) << 3)
  • STR X0, [SP, #0x8] ;X0寄存器的数据传送到SP+0x8地址值指向的存储空间
  • STP x29, x30, [sp, #0x10] ;入栈指令,一个寄存器是8Bytes,因此需要0x10个地址偏移的数据
  • LDP x29, x30, [sp, #0x10] ;出栈指令,
  • CBZ ;比较(Compare),如果结果为零(Zero)就转移(只能跳到后面的指令)
  • CBNZ ;比较,如果结果非零(Non Zero)就转移(只能跳到后面的指令)
  • CMP ;比较指令,相当于SUBS,影响程序状态寄存器CPSR
  • B/BL ;绝对跳转#imm, 返回地址保存到LR(X30);B指令不改变LR寄存器,但BL指令修改LR寄存器
  • RET ;子程序返回指令,返回地址默认保存在LR(X30)

跳转指令

  1. B/BL label:跳转到label指令地址处执行,会首先把该指令的下一条指令地址保存到lr寄存器。
    label偏移地址的计算:
    A: B/BL指令的地址;
    B:即将要跳转到的函数地址
    label = (B - A) >>2;最终结果右移2位,是因为指令地址是4字节对齐。
    示例: 400608 - 400664 = FFFFFFa4 >> 2 = FFFFFFe9
0000000000400608 :
  400608:       d10043ff        sub     sp, sp, #0x10
  40060c:       b9000fe0        str     w0, [sp,#12]
  400610:       b9000be1        str     w1, [sp,#8]
  400614:       b9400fe1        ldr     w1, [sp,#12]
  400618:       b9400be0        ldr     w0, [sp,#8]
  40061c:       0b000020        add     w0, w1, w0
  400620:       910043ff        add     sp, sp, #0x10
  400624:       d65f03c0        ret
0000000000400628 :
  400628:       d10043ff        sub     sp, sp, #0x10
  40062c:       b9000fe0        str     w0, [sp,#12]
  400630:       b9000be1        str     w1, [sp,#8]
  400634:       b9400fe1        ldr     w1, [sp,#12]
  400638:       b9400be0        ldr     w0, [sp,#8]
  40063c:       4b000020        sub     w0, w1, w0
  400640:       910043ff        add     sp, sp, #0x10
  400644:       d65f03c0        ret
0000000000400648 
: 400648: a9bd7bfd stp x29, x30, [sp,#-48]! # 将fp,lr寄存器进栈 40064c: 910003fd mov x29, sp # 将sp寄存器赋值给fd。fp相当于ebp; 400650: b9002fbf str wzr, [x29,#44] 400654: 52800020 mov w0, #0x1 // #1 400658: b9002ba0 str w0, [x29,#40] 40065c: b9402ba1 ldr w1, [x29,#40] 400660: b9402fa0 ldr w0, [x29,#44] 400664: 97ffffe9 bl 400608 400668: b90027a0 str w0, [x29,#36] 40066c: b9402ba1 ldr w1, [x29,#40] 400670: b9402fa0 ldr w0, [x29,#44] 400674: 97ffffe5 bl 400608 400678: b90023a0 str w0, [x29,#32] 40067c: b9402ba1 ldr w1, [x29,#40] 400680: b9402fa0 ldr w0, [x29,#44] 400684: 97ffffe1 bl 400608 400688: b9001fa0 str w0, [x29,#28] 40068c: b9402ba1 ldr w1, [x29,#40] 400690: b9402fa0 ldr w0, [x29,#44] 400694: 97ffffdd bl 400608 400698: b9001ba0 str w0, [x29,#24] 40069c: b9402ba1 ldr w1, [x29,#40] ##lr寄存器 (gdb) info registers x0 0x0 0 x1 0x1 1 x2 0xfffffffff488 281474976707720 x3 0x400648 4195912 x4 0x0 0 x5 0x0 0 x6 0xfffffffff470 281474976707696 x7 0x40 64 x8 0xffffffffffffffff -1 x9 0x3ffff 262143 x10 0x101010101010101 72340172838076673 x11 0x40 64 x12 0xffffbf6f2038 281473893474360 x13 0xffffbf6fefa8 281473893527464 x14 0x402 1026 x15 0x2 2 x16 0xffffbf568040 281473891860544 x17 0x410a08 4262408 x18 0xfffffffff260 281474976707168 x19 0x4006d0 4196048 x20 0x0 0 x21 0x0 0 x22 0x0 0 x23 0x0 0 x24 0x0 0 x25 0x0 0 x26 0x0 0 x27 0x0 0 x28 0x0 0 x29 0xfffffffff300 281474976707328 x30 0x400668 4195944 sp 0xfffffffff2f0 0xfffffffff2f0 pc 0x400614 0x400614 cpsr 0x60000000 1610612736 fpsr 0x0 0 fpcr 0x0 0

异常指令

svc:arm上实现系统调用的指令
Eg:系统调用read的系统调用为63,通过x8寄存器传入
ARM 汇编指令_第1张图片

ARM32

寄存器

  • r0 - r15:共16个通用寄存器,均为32bit
  • FP:r11充当,栈帧寄存器
  • sp:r13充当,堆栈指针寄存器
  • LR:r14充当,保存函数返回后执行的下一条指令地址寄存器
  • PC:r15充当,程序计数器
  • Cpsr:状态寄存器

gcc编译器属性

1. attribute((naked))

GCC6.1+版本支持:[Feature](https://www.mail-archive.com/[email protected]/msg509509.html)

Arm官方说明

你可能感兴趣的:(汇编)