x86架构基础汇编知识

news2024/11/20 1:48:21

 

通用寄存器

EAX 32位 函数返回值
AX 低16位 AH 高八位 AL 低八位
EBX 32位
ECX 32位 循环次数,this指针
EDX 32位
EBP 32位 栈底寄存器
ESP 32位 栈顶寄存器
ESI 源索引寄存器
EDI 目标索引寄存器

EIP 无法直接通过汇编操作

例子

mov al,0xff
add al,1
产生截断

mov al,0xff
add ax,1
产生进位

状态寄存器

状态寄存器(Status Register),也称为标志寄存器(Flag
Register),是计算机中的一种特殊寄存器。状态寄存器用于保存关于计算机状态和执行结果的信息,通常由一组二进制位组成,每个位都对应一个特定的状态标志。

在x86架构中,状态寄存器通常由一些标志位组成,其中包括:

  1. 零标志位(Zero Flag,ZF):指示最近的运算结果是否为零。如果运算结果为零,则ZF被置为1,否则为0。
  2. 进位标志位(Carry Flag,CF):用于处理进位和借位操作。如果最近的运算产生了进位(或借位),CF被置为1,否则为0。
  3. 溢出标志位(Overflow Flag,OF):用于检测运算结果是否溢出。如果最近的运算结果造成了溢出,OF标志被置为1,否则为0。
  4. 符号标志位(Sign Flag,SF):指示最近的运算结果的符号。如果结果为负数,则SF被置为1,否则为0。
  5. 奇偶标志位(Parity Flag,PF):指示最近的运算结果中设置了偶数个位的数量。如果结果中偶数个位被设置为1,则PF被置为1,否则为0。
  6. 调整标志位(Adjust Flag,AF):在二进制代码运算中用于处理BCD码(二进制编码的十进制数)。在一般的计算中不常使用。

除了上述标志位外,不同架构和处理器还可能存在其他特定的标志位。

状态寄存器广泛用于控制和判断程序的执行流程,以及进行条件分支和循环控制。通过检查和设置状态寄存器中的标志位,程序可以根据运算结果和条件进行相应的操作。
JCC指令

指令条件
JZ等于(ZF=1)
JE等于(ZF=1)
JNZ不等于(ZF=0)
JNE不等于(ZF=0)
JA无符号大于(CF=0且ZF=0)
JNBE无符号大于(CF=0且ZF=0)
JAE无符号大于等于(CF=0)
JNB无符号大于等于(CF=0)
JNC无符号大于等于(CF=0)
JB无符号小于(CF=1)
JNAE无符号小于(CF=1)
JBE无符号小于等于(CF=1或ZF=1)
JNA无符号小于等于(CF=1或ZF=1)
JCXZCX/ECX为零
JECXZECX为零
JG有符号大于(ZF=0且SF=OF)
JNLE有符号大于(ZF=0且SF=OF)
JGE有符号大于等于(SF=OF)
JNL有符号大于等于(SF=OF)
JL有符号小于(SF≠OF)
JNGE有符号小于(SF≠OF)
JLE有符号小于等于(ZF=1或SF≠OF)
JNG有符号小于等于(ZF=1或SF≠OF)
JO溢出(OF=1)
JNO未溢出(OF=0)
JS负数(SF=1)
JNS非负数(SF=0)

汇编指令

分类示例指令功能
数据传输指令MOV从一个位置复制数据到另一个位置
PUSH将数据推入堆栈
POP将数据从堆栈弹出
XCHG交换两个位置的数据
LEA加载地址
MOVS将一个字符串的数据复制到另一个字符串
LODS将数据从一个位置加载到累加器
STOS将累加器中的数据存储到一个位置
算术和逻辑指令ADD将两个数相加
SUB从一个数中减去另一个数
MUL执行无符号乘法
DIV执行无符号除法
AND执行逻辑与操作
OR执行逻辑或操作
XOR执行异或操作
NOT执行逻辑非操作
控制流指令JMP无条件跳转到指定地址
Jcc条件跳转指令,根据标志位执行跳转
CALL调用子程序或函数
RET返回子程序或函数调用点
INT触发中断服务例程
LOOP根据计数器值循环执行指令
HLT暂停处理器运行
状态标志位指令CMP比较两个数
TEST按位进行与操作并更新标志位
CLC清除进位标志位
STC设置进位标志位
CMC取反进位标志位
CLD清除方向标志位
STD设置方向标志位
字符串和循环指令MOVS将一个字符串的数据复制到另一个字符串
CMPS比较两个字符串的数据
SCAS在字符串中搜索指定的数据
REP重复执行指令块
REPE/REPZ如果相等则重复执行指令块
REPNE/REPNZ如果不相等则重复执行指令块
堆栈指令PUSH将数据推入堆栈
POP将数据从堆栈弹出
PUSHAD将所有通用寄存器的值推入堆栈
POPAD将所有通用寄存器的值从堆栈弹出
PUSHA将通用寄存器的值推入堆栈
POPA将通用寄存器的值从堆栈弹出
过程和函数指令CALL调用子程序或函数
RET返回子程序或函数调用点
ENTER建立堆栈帧
LEAVE恢复调用者的堆栈帧
PROC定义一个过程
ENDP定义过程结束
I/O指令IN从指定端口读取数据
OUT将数据写入指定端口
INS从数据端口读取数据到字符串
OUTS将字符串的数据写入到数据端口
CLI关中断
STI开中断

通用寄存器

EAX 32位 函数返回值
AX 低16位 AH 高八位 AL 低八位
EBX 32位
ECX 32位 循环次数,this指针
EDX 32位
EBP 32位 栈底寄存器
ESP 32位 栈顶寄存器
ESI 源索引寄存器
EDI 目标索引寄存器

EIP 无法直接通过汇编操作

例子

mov al,0xff
add al,1
产生截断

mov al,0xff
add ax,1
产生进位

状态寄存器

​编辑

2023-08-30T09:03:45.png

状态寄存器(Status Register),也称为标志寄存器(Flag
Register),是计算机中的一种特殊寄存器。状态寄存器用于保存关于计算机状态和执行结果的信息,通常由一组二进制位组成,每个位都对应一个特定的状态标志。

在x86架构中,状态寄存器通常由一些标志位组成,其中包括:

  1. 零标志位(Zero Flag,ZF):指示最近的运算结果是否为零。如果运算结果为零,则ZF被置为1,否则为0。
  2. 进位标志位(Carry Flag,CF):用于处理进位和借位操作。如果最近的运算产生了进位(或借位),CF被置为1,否则为0。
  3. 溢出标志位(Overflow Flag,OF):用于检测运算结果是否溢出。如果最近的运算结果造成了溢出,OF标志被置为1,否则为0。
  4. 符号标志位(Sign Flag,SF):指示最近的运算结果的符号。如果结果为负数,则SF被置为1,否则为0。
  5. 奇偶标志位(Parity Flag,PF):指示最近的运算结果中设置了偶数个位的数量。如果结果中偶数个位被设置为1,则PF被置为1,否则为0。
  6. 调整标志位(Adjust Flag,AF):在二进制代码运算中用于处理BCD码(二进制编码的十进制数)。在一般的计算中不常使用。

除了上述标志位外,不同架构和处理器还可能存在其他特定的标志位。

状态寄存器广泛用于控制和判断程序的执行流程,以及进行条件分支和循环控制。通过检查和设置状态寄存器中的标志位,程序可以根据运算结果和条件进行相应的操作。
JCC指令

指令条件
JZ等于(ZF=1)
JE等于(ZF=1)
JNZ不等于(ZF=0)
JNE不等于(ZF=0)
JA无符号大于(CF=0且ZF=0)
JNBE无符号大于(CF=0且ZF=0)
JAE无符号大于等于(CF=0)
JNB无符号大于等于(CF=0)
JNC无符号大于等于(CF=0)
JB无符号小于(CF=1)
JNAE无符号小于(CF=1)
JBE无符号小于等于(CF=1或ZF=1)
JNA无符号小于等于(CF=1或ZF=1)
JCXZCX/ECX为零
JECXZECX为零
JG有符号大于(ZF=0且SF=OF)
JNLE有符号大于(ZF=0且SF=OF)
JGE有符号大于等于(SF=OF)
JNL有符号大于等于(SF=OF)
JL有符号小于(SF≠OF)
JNGE有符号小于(SF≠OF)
JLE有符号小于等于(ZF=1或SF≠OF)
JNG有符号小于等于(ZF=1或SF≠OF)
JO溢出(OF=1)
JNO未溢出(OF=0)
JS负数(SF=1)
JNS非负数(SF=0)

​编辑

2023-08-30T09:14:35.png

汇编指令

分类示例指令功能
数据传输指令MOV从一个位置复制数据到另一个位置
PUSH将数据推入堆栈
POP将数据从堆栈弹出
XCHG交换两个位置的数据
LEA加载地址
MOVS将一个字符串的数据复制到另一个字符串
LODS将数据从一个位置加载到累加器
STOS将累加器中的数据存储到一个位置
算术和逻辑指令ADD将两个数相加
SUB从一个数中减去另一个数
MUL执行无符号乘法
DIV执行无符号除法
AND执行逻辑与操作
OR执行逻辑或操作
XOR执行异或操作
NOT执行逻辑非操作
控制流指令JMP无条件跳转到指定地址
Jcc条件跳转指令,根据标志位执行跳转
CALL调用子程序或函数
RET返回子程序或函数调用点
INT触发中断服务例程
LOOP根据计数器值循环执行指令
HLT暂停处理器运行
状态标志位指令CMP比较两个数
TEST按位进行与操作并更新标志位
CLC清除进位标志位
STC设置进位标志位
CMC取反进位标志位
CLD清除方向标志位
STD设置方向标志位
字符串和循环指令MOVS将一个字符串的数据复制到另一个字符串
CMPS比较两个字符串的数据
SCAS在字符串中搜索指定的数据
REP重复执行指令块
REPE/REPZ如果相等则重复执行指令块
REPNE/REPNZ如果不相等则重复执行指令块
堆栈指令PUSH将数据推入堆栈
POP将数据从堆栈弹出
PUSHAD将所有通用寄存器的值推入堆栈
POPAD将所有通用寄存器的值从堆栈弹出
PUSHA将通用寄存器的值推入堆栈
POPA将通用寄存器的值从堆栈弹出
过程和函数指令CALL调用子程序或函数
RET返回子程序或函数调用点
ENTER建立堆栈帧
LEAVE恢复调用者的堆栈帧
PROC定义一个过程
ENDP定义过程结束
I/O指令IN从指定端口读取数据
OUT将数据写入指定端口
INS从数据端口读取数据到字符串
OUTS将字符串的数据写入到数据端口
CLI关中断
STI开中断

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1011157.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SQL SERVER 中无法删除table ‘biao’,因为它不存在或者您不具备相应的权限

删除table表 1.删除表示提示:SQL SERVER 中无法删除table ‘biao’,因为它不存在或者您不具备相应的权限。2.原因3.解决方法3.1 图3.2 图3.3 图3.4 图 1.删除表示提示:SQL SERVER 中无法删除table ‘biao’,因为它不存在或者您不具…

CRM软件系统如何实现客户的精细化管理

客户是企业的生命线,对客户进行精细化管理,是提高企业收益的关键。那么,如何进行客户管理?CRM系统可以实现精细化管理客户,提升客户的价值。下面我们就来详细说一说。 1、获取客户信息 CRM系统可以通过web表单、在线聊…

【Java 基础篇】深入了解Java中的键值对集合:Map集合详解

Map是Java中常用的数据结构之一,用于存储键值对(Key-Value)映射。它提供了快速的查找和访问能力,是编程中常用的工具之一。本文将深入介绍Java中的Map集合,包括常见的Map实现类、基本操作、使用示例以及一些重要的注意…

C++基础:字符串

字符串 字符串是一种非常常见的数据类型,用于存储和操作文本数据。C提供了多种方式来表示字符串,其中最常用的是使用std::string类。以下是关于C字符串的一些基本信息和操作示例: 字符 : ’ (单引号是一个字符,如果要赋值成数组…

【服务器】带外管理口 iDRAC接口

服务器带外管理口 也就是标识为iDRAC的接口 使用时,将笔记本直接通过网线连接到这个接口 笔记本上设置以太网连接的属性为手动IP,例如192.168.0.100 然后ping 192.168.0.120(服务器的默认的带外IP) 理论上应该是好使的

FastJSON将对象转JSON字符串引发的血案

问题:最近工作中需要将一个将近两百页的pdf的base64作为value转成JSON字符串,而代码中使用的方案就是JSONObject.toJSONString(obj); 而结果就是引发了OOM内存溢出。 翻阅源码找到一段关键点: 也就是说FastJSON内部设置了一个阈值&#xff…

【Node.js】认识express并创建基本web服务器:

文章目录 一、初识 Express【1】Express 简介【2】Express 的基本使用【3】托管静态资源【4】nodemon 二、Express 路由【1】路由的概念【2】路由的使用 三、Express 中间件【1】中间件的概念【2】Express 中间件的初体验【3】中间件的分类【4】自定义中间件 四、使用 Express …

钉钉群机器人撤回信息-实操详细教程

仅支持企业应用 1.在开发平台创建机器人,勾选机器人配置 发布 最终要在这里能找到才算成功 注:发布后要在钉钉内部群添加机器人选择新建的 第一步:获取accessToken(程序权限) 找到Appkey和AppSecret import requests…

JWT 安全及案例实战

文章目录 一、JWT (json web token)安全1. Cookie(放在浏览器)2. Session(放在服务器)3. Token4. JWT (json web token)4.1 头部4.1.1 alg4.1.2 typ 4.2 payload4.3 签名4.4 通信流程 5. 防御措施 二、漏洞实例(webgoa…

教你自己制作一个ALU

计算机在没有齿轮的时候是如何负责运算的呢? ALU就是计算机里负责运算的组件,这篇文章就是教你自己做一个ALU 第一个ALU 1970年,第一个封装在单个芯片内的完整ALU——英特尔74181诞生,这在当时是惊人的工程壮举! 算…

微信小程序的疫苗接种预约设计与实现vue+uniapp

对于本小程序的疫苗预约的设计来说,系统开发主要是采用java语言,在整个系统的设计中应用MySql数据库来完成数据存储,具体根据疫苗预约信息的现状来进行开发的,具体根据现实的需求来实现疫苗预约网络化的管理,各类信息有…

华为云云耀云服务器L实例评测|StackEdit中文版在线Markdown笔记工具

华为云云耀云服务器L实例评测|StackEdit中文版在线Markdown笔记工具 一、云耀云服务器L实例介绍1.1 云服务器介绍1.2 应用场景1.3 支持镜像 二、云耀云服务器L实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置 三、部署 StackEdit 中文版3.1 StackEdit 介绍3.2 环…

C语言基础语法复习06-c语言关键字

ANSI标准定义的C语言关键字共32个: void char int float double short long signed unsigned struct union enum typedef sizeof auto static register extern const volatile return continue break goto if else switch case default for do while C99新增关键字:…

1222.可以攻击国王的皇后

在一个 8x8 的棋盘上,放置着若干「黑皇后」和一个「白国王」。 给定一个由整数坐标组成的数组 queens ,表示黑皇后的位置;以及一对坐标 king ,表示白国王的位置,返回所有可以攻击国王的皇后的坐标(任意顺序)。 示例 1…

Spring续集

6.2、转发视图 SpringMVC中默认的转发视图是InternalResourceView SpringMVC中创建转发视图的情况: 当控制器方法中所设置的视图名称以"forward:"为前缀时,创建InternalResourceView视图,此时的视图名称不会被SpringMVC配置文件中所…

前后端开发接口联调对接参数

前言 一个完整的互联网系统项目,需要前后端配合,进行上线,针对前端开发者,现在互联网主流的项目都是前后端分离 也就是后端负责提供数据接口,前端负责UI界面数据渲染 凡是在前台数据展示与用户交互的,都是由前端来实现的,而数据来源是由后台服务提供的 在浏览器c端能够发送后端…

STM32 ~ GPIO不同模式之间的区别与实现原理

GPIO全称General Purpose Input Output ,即通用输入/输出。其实GPIO的本质就是芯片的一个引脚,通常在ARM中所有的I/O都是通用的。不过,由于每个开发板上都会设计不同的外围电路,这就造成了GPIO的功能可能有所不同。大部分GPIO都是…

百度测开初面面试题分享(答案+文档)

1、java常用的异常处理机制 Java常用的异常处理机制有以下几种: 1)try-catch-finally语句:用于捕获和处理异常。将可能抛出异常的代码放在try块中,然后在catch块中处理异常。无论是否发生异常,finally块中的代码都会…

算法总结10 线段树

算法总结10 线段树 线段树2569. 更新数组后处理求和查询 线段树 有一个数组,我们要: 更新数组的值(例如:都加上一个数,把子数组内的元素取反)查询一个子数组的值(例如:求和&#x…

【进阶篇】MySQL数据库中的 锁详解

文章目录 1. 介绍2. MySQL 锁类型3. 锁的粒度4. 锁的使用场景和示例5. 锁的性能优化和注意事项6. MySQL 的锁机制和实现细节1. 锁的存储和管理2. 锁的竞争和调度3. 锁的实现原理 7. 锁的调优和故障处理1. 锁等待和超时:2. 死锁处理和恢复:3. 锁的监控和分…