当前位置:   article > 正文

c语言变址指令,汇编的几个指令

c语言汇编指令 函数地址

常见寄存器

寄存器

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用于负数(偏移值是负数)。

7b94cad9845a

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语言中的子函数调用和返回

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/531583
推荐阅读
相关标签
  

闽ICP备14008679号