00-安全攻防之汇编语法

  1. mov指令(传送指令):可以用来修改大部分寄存器的值

mov x0,#10、mov x1,#20
解读:

  • #表示是立即数, #10,表示立即数为10
  • x0 和 x1 表示 通用寄存器中的x0和x1的位置
  • 整体的意思是:将立即数 #10的值放到x0寄存器上;将立即数#20的值放到x1的寄存器上
  1. add:两个数相加的运算符

add x1, x0, #0x14
解读:

  • 0x表示16进制,0x14 就是14的十六进制,换成十进制为20
  • 整体的意思:将x0寄存器上的值 与 0x14 相加 将结果保存到x1 寄存器上
  1. adds:由于加了s标志,当进行add运算的时候,cpu的状态寄存器的值将会被运算的结果修改。

状态寄存器的基础知识,可以参考:https://blog.csdn.net/lyz0925/article/details/107215657

  1. bl指令:ARM64提供了bl指令来修改PC寄存器的值,这些指令统称为转移指令,最简单的是bl指令。

bl _B
解读:

  • bl 是跳转指令
  • _B 是函数名
  • 整句的意思是:跳转到_B的函数
  • 再跳转之前,会有两个操作:

将下一条指令的地址放入lr(x30)寄存器
然后转到标号处执行指令

  1. ret:默认使用lr(x30)寄存器的值,通过底层指令提示CPU此处作为下条指令地址! 也就是说,当执行ret指令时,CPU会执行lr(x30)这个寄存器存的内存地址指向的命令

详细,可参考如下文章:https://blog.csdn.net/lyz0925/article/details/107140034

  1. sub:两数相减的运算符

sub w0,w0,#0xff
解读:将w0寄存器的值 减去 0xff,将结果存放在w0中

  1. subs:两数相减的运算符,当进行sub运算的时候,cpu的状态寄存器的值将会被运算的结果修改。

subs w0,w0,#0xff
解读:将w0寄存器的值 减去 0xff,将结果存放在w0中,并根据运算的结果修改状态寄存器的值。

  1. [sp, #0x10]!: 将sp的值与0x10相加,并把结果存入sp中

[sp, #0x10]!
解读:

  • [sp, #0x10]! = add sp, sp, #0x10
  1. [sp, #-0x10]!: 将sp的值与0x10相减,并把结果存入sp中

[sp, #-0x10]!
解读:

  • [sp, #-0x10]! = sub sp, sp, #0x10
  1. str(store register)指令:将数据从寄存器中读出来,存到内存中.

将数据从寄存器中读出来,存到内存

  1. ldr(load register)指令:将数据从内存中读出来,存到寄存器

ldr x30, [sp], #0x10
解读:
上面那句代码可以分解成两个步骤:
ldr x30, [sp] //-------->[sp] 表示取出sp寄存器的值,将[sp]的值读出去存放到x30中
add sp, sp, #0x10

  1. adrp x0, 1

解读:

  • 将**1的值,左移12位, 即:等于1 0000 0000 0000 = 0x1000**
  • 将pc寄存器的低12位清零, 例如,pc寄存器位0x1000236874 , 低12位清零后为 0x1000236000(注意,12位等于12bit,等于3个16进制位)
  • 将前面两步的结果相加 给x0寄存器,即 等于 0x1000237000
  1. larsw x10, [x8, x9, lsl #2]

解读:
以x8的地址为基地址,加上x9的值向左偏移2位
取出计算的结果的内存地址存放的值,赋值给x10
例如:x9 的值为1, 左移两位 等于4, 则x8 + 4 的值 给x10

后续学到了,继续更新~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值