美文网首页
汇编的几个指令

汇编的几个指令

作者: SpringAlways | 来源:发表于2020-04-16 05:54 被阅读0次

常见寄存器

寄存器 x86 x86-64 arm arm64
累加寄存器 EAX RAX
基址寄存器 EBX RBX
计数寄存器 ECX RCX
数据寄存器 EDX RDX
堆栈基指针 EBP RBP
变址寄存器 ESI RSI
堆栈顶指针 ESP RSP
指令寄存器 EIP RIP

ARM处理器用到的指令集分为 ARM 和 THUMB 两种。ARM指令长度固定为32bit,THUMB指令长度固定为16bit。所以 ARM64指令集的指令长度为32bit

#if __LP64__
#define __WORDSIZE 64
#else
#define __WORDSIZE 32
#endif

那么 LP64 是什么意思呢?
在64位机器上,如果int是32位,long是64位,pointer也是64位,那么该机器就是LP64的,其中的L表示Long,P表示Pointer,64表示Long和Pointer都是64位的。
Word 字长,还有半字(字的一半)、双字(字的2倍)的概念。

arm64总共有64个寄存器,31个通用寄存器,外加SP 、 PC、CPSR。其中31个由x0-x30表示,x29和x30有别名,x29又称为FP(Frame Pointer)栈底指针,x30又称LR(Link Register)连接寄存器,表示当前子程序执行完后,下一条要执行的程序地址。

mov指令
  • 寄存器寻址 movl %eax, %edx eax -> edx
  • 立即数寻址 movl $0x123, %edx
  • 直接寻址 movl 0x123, %edx 直接访问内存地址数据,edx = *(int32_t *)0x123;
  • 间接寻址 movl (%ebx), %edx %ebx 是个内存地址,(%ebx)指的是该地址中的数据,edx = *(int32_t*)ebx;
  • 变址寻址movl 4(%ebx), %edx edx = (int32_t)(ebx+4);
push & pull指令
  • 程序调用
  • 传递参数
  • 保存返回地址
  • 提供局部变量
  • 相关寄存器:esp,ebp
  • 相关操作
//建立被调用者函数的堆栈框架
pushl %ebp
movl %esp, %ebp

//拆除框架
movl %ebp, %esp
popl %ebp
ret
push %eax
pop %eax

//相当于下面代码
subl $4, %esp
//栈顶指针减4
movl %eax, (%esp)
//%eax -> esp 地址
movl (%esp), %eax
addl %4, %esp
//栈顶指针加4
call指令

call 0x12345相当于

pushl %eip
movl $0x12345, %eip
//当前地址压栈,存入新地址
ret指令

相当于

popl %eip
//栈 -> eip
enter指令
push %ebp
movl %esp, %ebp
//将堆栈置空(栈上重堆)
leave指令
movl %ebp, %esp
popl %ebp
//将堆栈置空(撤销堆栈)
ldur与ldr

ld:load,即读取的意思
ldr:取内存中的数据,放到另一个寄存器中。

ldr用于正数(偏移值是正数);
ldur用于负数(偏移值是负数)。


image.png
bl+mov pc,lr

和b指令类似的,另外还有一个bl指令,语法是:

BL{cond} label
其作用是,除了b指令跳转到label之外,在跳转之前,先把下一条指令地址存到lr寄存器中,以方便跳转到那边执行完毕后,将lr再赋值给pc,以实现函数返回,继续执行下面的指令的效果。

用下面这个start.S中的例子来说明:

bl  cpu_init_crit

......
cpu_init_crit:
......
mov pc, lr

其中,就是先调用bl掉转到对应的标号cpu_init_crit,其实就是相当于一个函数了,

然后在cpu_init_crit部分,执行完毕后,最后调用 mov pc, lr,将lr中的值,赋给pc,即实现函数的返回原先 bl cpu_init_crit下面那条代码,继续执行函数。

上面的整个过程,用C语言表示的话,就相当于

......
cpu_init_crit();
......

void cpu_init_crit(void)
{
......
}

而关于C语言中,函数的跳转前后所要做的事情,都是C语言编译器帮我们实现好了,会将此C语言中的函数调用,转化为对应的汇编代码的。

其中,此处所说的,函数掉转前后所要做的事情,就是:

函数跳转前
要将当前指令的下一条指令的地址,保存到lr寄存器中

函数调用完毕后
将之前保存的lr的值给pc,实现函数跳转回来。继续执行下一条指令。

而如果你本身自己写汇编语言的话,那么这些函数跳转前后要做的事情,都是你程序员自己要关心,要实现的事情。
总结汇编中的:bl + mov pc,lr
汇编中bl + mov pc,lr = C语言中的子函数调用和返回

相关文章

  • 汇编的几个指令

    常见寄存器 寄存器x86x86-64armarm64累加寄存器EAXRAX基址寄存器EBXRBX计数寄存器ECXR...

  • 逆向笔记(三)-汇编指令

    汇编指令 针对汇编来说,汇编指令是必须了解的,而且汇编中汇编指令比较多,但是每一个汇编指令对应的机器码是固定不变的...

  • 16位汇编简记

    汇编: 汇编即是机器指令助记符,机器指令让cpu工作。像是mov、jmp、jcxz等汇编指令都有对应的机器指令。有...

  • 逆向学习 持续更新中

    什么是汇编 机器指令能被计算机直接识别 汇编指令需要通过编译器转为机器指令 汇编指令和机器指令的差别在于指令的表示...

  • 学习汇编--写一个完整的汇编(一)

    汇编指令 汇编有两类指令组成汇编指令如move,add,sub等,有对应的机器指令,可以被编译为机器指令最终被CP...

  • <<汇编语言>>第1章笔记

    第一章 基础知识 汇编语言基本概念 汇编指令是机器指令便于记忆的书写格式,通过编译器把汇编指令对应到机器指令,汇编...

  • 汇编三

    完整的汇编指令:#### 汇编由两种指令组成1.汇编指令如mov、add、sub等有对应的机器指令,可以被编译为机...

  • 彻底搞清楚Java并发 (二) 底层实现

    Java代码 -> Java字节码 -> 汇编指令(汇编指令是cpu指令的集合) Volatile Java语言提...

  • 2.8 常用的汇编指令

    2.8 常用的汇编指令 本节必须掌握的知识点: 汇编指令 多动手实验,知道每个指令的功能 在此节之前汇编课程主要讲...

  • 汇编程序基础

    汇编程序基础 一、汇编程序基本结构 二、汇编指令 1.汇编指令基本结构 三、伪指令 1.段定义 2.数据定义 数据...

网友评论

      本文标题:汇编的几个指令

      本文链接:https://www.haomeiwen.com/subject/nbqlvhtx.html