当前位置 博文首页 > 随意的风的专栏:几种基本汇编指令详解
寄存器 | 16位 | 32位 | 64位 |
---|---|---|---|
累加寄存器 | AX | EAX | RAX |
基址寄存器 | BX | EBX | RBX |
计数寄存器 | CX | ECX | RCX |
数据寄存器 | DX | EDX | RDX |
堆栈基指针 | BP | EBP | RBP |
变址寄存器 | SI | ESI | RSI |
堆栈顶指针 | SP | ESP | RSP |
指令寄存器 | IP | EIP | RIP |
movb(8位)、movw(16位)、movl(32位)、movq(64位)
寄存器寻址:
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);
相关寄存器: esp, ebp
相关操作: pop, push
//建立被调用者函数的堆栈框架
pushl %ebp
movl %esp, %ebp
//拆除框架
movl %ebp, %esp
popl %ebp
ret
push %eax
相当于:
subl $4, %esp
//栈顶指针减4
movl %eax, (%esp)
//%eax -> esp 地址
pop %eax
相当于:
movl (%esp), %eax
addl %4, %esp
//栈顶指针加4
call 0x12345
相当于:
pushl %eip
movl $0x12345, %eip
//当前地址压栈,存入新地址
相当于:
popl %eip
//栈 -> eip
push %ebp
movl %esp, %ebp
//将堆栈置空(栈上重堆)
movl %ebp, %esp
popl %ebp
//将堆栈置空(撤销堆栈)
pushl $8 ①
movl %esp, %ebp ②
subl $4, %esp ③
movl $8, (%esp) ④
ARM中LR存储的是PC的值,IR存储的是下一条将要执行的指令,有什么区别?
先看定义:
(1)PC是程序计数器,存储将要执行的指令地址
(2)LR是链接寄存器,是ARM处理器中一个有特殊用途的寄存器,当调用函数时,返回地址即PC的值被保存到LR中(mov lr,pc)。
(3)IR是指令寄存器,用来保存当前正在执行的一条指令。当执行一条指令时,先把它从内存取到数据寄存器(DR)中(有的书上叫做缓冲寄存器,BR),然后再传送至IR。
说白了,LR存的是指令地址,IR存的是指令内容。
cs