当前位置: 首页 > news >正文

x86架构中的寄存器和常用指令

寄存器

这些寄存器可以用于多种操作,如算术运算、数据传输等。在 x86 架构中,这些包括:

通用

这些寄存器可以用于多种操作,如算术运算、数据传输等
AX/EAX/RAX:累加器,用于算术运算。通常用于存储函数调用返回值
BX/EBX/RBX:基址寄存器,用于地址指定。
CX/ECX/RCX:计数寄存器,用于字符串操作和循环计数,this指针
DX/EDX/RDX:数据寄存器,用于 I/O 操作和一些算术运算。

在这里插入图片描述

索引寄存器

用于字符串操作和数组处理:
SI/ESI/RSI:源索引寄存器,用于字符串操作中的源地址指定。
DI/EDI/RDI:目的索引寄存器,用于字符串操作中的目标地址指定。字符串操作时,用于存放目的地址的,和esi两个经常搭配一起使用,执行字符串的复制等操作

指针寄存器

用于指向栈和基址:
IP/EIP/RIP:指令指针寄存器,包含下一条要执行的指令的地址。
IR(指令寄存器):存储当前正在执行的指令。
SP/ESP/RSP:堆栈指针寄存器,指向栈顶。栈顶指针,指向栈的顶部
BP/EBP/RBP:栈底指针,指向栈的底部,通常用ebp+偏移量的形式来定位函数存放在栈中的局部变量

状态和控制寄存器

FLAGS/EFLAGS/RFLAGS:标志寄存器,包含了当前状态标志,如零标志、进位标志、溢出标志等。
CR0、CR1、…:控制寄存器,用于控制操作系统的行为,如内存管理、缓存控制等。

段寄存器

在 x86 架构中,用于内存分段:
CS:代码段寄存器,包含当前执行代码的段基址。
DS:数据段寄存器,通常包含数据的段基址。
SS:堆栈段寄存器,包含栈的段基址。
ES、FS、GS:额外的段寄存器,用于特殊用途。

R8 - 第8个通用寄存器,可用于多种目的。
R9 - 第9个通用寄存器,可用于多种目的。
R10 - 第10个通用寄存器,可用于多种目的。
R11 - 第11个通用寄存器,可用于多种目的。
R12 - 第12个通用寄存器,可用于多种目的。
R13 - 第13个通用寄存器,可用于多种目的。
R14 - 第14个通用寄存器,可用于多种目的。
R15 - 第15个通用寄存器,可用于多种目的。

函数调用使用

rax:通常用于存储函数调用返回值
rsp:栈顶指针,指向栈的顶部
rdi:第一个入参
rsi:第二个入参
rdx:第三个入参
rcx:第四个入参
r8:第五个入参
r9:第六个入参
rbx:数据存储,遵循Callee Save原则
rbp:数据存储,遵循Callee Save原则
r12~r15:数据存储,遵循Callee Save原则
r10~r11:数据存储,遵循Caller Save原则

参考

https://zhuanlan.zhihu.com/p/664901746
https://zhuanlan.zhihu.com/p/502718676

指令

在这里插入图片描述

MOV 将源操作数传送到目标操作数
ADD 将源操作数与目标操作数相加 最后结果给到目标操作数
SUB 将源操作数与目标操作数相减 最后结果给到目标操作数
AND 将源操作数与目标操作数进行与运算 最后结果给到目标操作数
OR 将源操作数与目标操作数进行或运算 最后结果给到目标操作数
XOR 将源操作数与目标操作数进行异或运算 最后结果给到目标操作数
NOT 将源操作数与目标操作数进行异非运算 最后结果给到目标操作数
MOVS 数据传送 与MOV不同处在于它可以将内存的数据传送到内存
STOS 将 AL AX EAX 的值存到EDI指定的内存地址
REP 循环

先入后出
PUSH 押入 通用寄存器 内存地址 立即数
POP 释放。通用寄存器 内存地址

JMP指令 (EIP劫持)
JMP 寄存器 内存 立即数
修改EIP

CALL指令 相当于
push %eip
jmp addr

RET 指令 表示返回

参考

https://www.cnblogs.com/mazhimazhi/p/15241450.html

相关文章:

  • FlinkSQL之Flink SQL Join二三事
  • <el-table>设置一列为固定字段,其他列为循环生成
  • 星光/宝骏/缤果/长安 车机CarPlay手机操作破解教程V2.0版本(无需笔记本、无需笔记本、无需笔记本)
  • 各大pdf转word软件都用的哪家的ocr引擎?
  • 详解IOS的Automatically Sign在设备上打包
  • MySQL索引18连问,谁能顶住
  • Hbase 王者荣耀数据表 HBase常用Shell命令
  • 目标检测——中国交通标志数据集
  • JAVA 100道题(22)
  • QT基本数据类型
  • Redis持久化:RDB与AOF
  • Facebook账号防封方法及解禁方法
  • 图论记录之最短路迪杰斯特拉
  • 【已修复】iPhone13 Pro 长焦相机水印(黑斑)修复 洗水印
  • 百度智能云千帆,产业创新新引擎
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • conda常用的命令
  • extract-text-webpack-plugin用法
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • Laravel 中的一个后期静态绑定
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • Netty源码解析1-Buffer
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • scala基础语法(二)
  • SpriteKit 技巧之添加背景图片
  • webpack入门学习手记(二)
  • 汉诺塔算法
  • 我的面试准备过程--容器(更新中)
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 系统认识JavaScript正则表达式
  • 怎么将电脑中的声音录制成WAV格式
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • 从如何停掉 Promise 链说起
  • 关于Android全面屏虚拟导航栏的适配总结
  • #pragma once与条件编译
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (SpringBoot)第二章:Spring创建和使用
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (全注解开发)学习Spring-MVC的第三天
  • (三分钟)速览传统边缘检测算子
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • **PHP分步表单提交思路(分页表单提交)
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .NET Core中的去虚
  • .net refrector
  • .net 无限分类
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • .NET设计模式(2):单件模式(Singleton Pattern)
  • .NET应用架构设计:原则、模式与实践 目录预览
  • :not(:first-child)和:not(:last-child)的用法