• x86架构基础汇编知识


     

    通用寄存器

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

    EIP 无法直接通过汇编操作

    例子

    1. mov al,0xff
    2. add al,1
    3. 产生截断
    4. mov al,0xff
    5. add ax,1
    6. 产生进位

    状态寄存器

    状态寄存器(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 无法直接通过汇编操作

    例子

    1. mov al,0xff
    2. add al,1
    3. 产生截断
    4. mov al,0xff
    5. add ax,1
    6. 产生进位

    状态寄存器

    ​编辑

    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开中断
  • 相关阅读:
    电源芯片的选择简略
    Max Sum Plus Plus HDU - 1024
    基于QtGUI的宠物小精灵对战游戏设计
    redis分布式秒杀锁
    auto 推导
    塑造下一代教育的关键力量:AIGC在教育革命中的角色扮演
    ROS中结合C++语言实现HelloWorld
    2022 年移动应用开发终极指南
    绘图问题记录
    后端接口性能优化分析-问题发现&问题定义
  • 原文地址:https://blog.csdn.net/m0_73731708/article/details/132892956