FEATURED · 精选文章

x86x64汇编基础命令精讲

发布时间 / 2026/9/1 20:28:39
来源 / 创域科博编辑部
栏目 / 资讯中心
x86x64汇编基础命令精讲 一. 汇编基础1.1 计算机架构架构位数指令集特点常见设备x8632位CISC老架构兼容性好老电脑x86-64AMD6464位CISC当前PC主流性能强台式机、笔记本ARM32位RISC低功耗移动设备ARM6464位RISC高性能低功耗新型笔记本、平板32位程序的内存地址都是4个字节64位程序的内存地址都是8个字节1.2 汇编基础1.2.1 CPU中央处理器CPU是计算机的“大脑”负责指挥整个计算机系统的工作。它从内存中读取指令并根据这些指令进行计算和数据处理。1.2.2 寄存器Registers寄存器是 CPU 内部的高速存储单元。它用于存放临时的数据和计算的中间结果具有非常快的访问速度。寄存器的数量和种类有限但它们比内存更快因为它们直接位于CPU 内部。常见的寄存器有通用寄存器如EAX、EBX指针寄存器如ESP、EBP标志寄存器如EFLAGS1.2.3内存RAM 主存储器内存用于存放正在运行的程序的数据和指令。与寄存器相比内存空间要大得多但访问速度较慢。CPU 会从内存中读取指令并在内存中读取或写入数据。内存通过内存总线与 CPU 和其他硬件组件进行连接。1.3 寄存器1.3.1 32位在32位 x86 架构中有8个主要通用寄存器寄存器名称主要作用PWN/逆向中的用途EAX累加寄存器存放计算结果、函数返回值保存返回值、系统调用编号EBX基址寄存器存放基地址、内存地址保存数据地址ECX计数寄存器循环计数、字符串操作循环次数、rep指令EDX数据寄存器辅助计算、存放数据乘除法高32位ESI源变址寄存器源地址指针字符串复制源地址EDI目的变址寄存器目标地址指针字符串复制目标地址ESP栈指针寄存器指向当前栈顶栈操作、栈溢出EBP栈基址寄存器指向当前栈底函数栈帧、调试1.3.2 标志寄存器标志位全称说明CFCarry Flag进位标志表示加法或移位操作是否产生进位ZFZero Flag零标志表示运算结果是否为零SFSign Flag符号标志表示运算结果的符号位OFOverflow Flag溢出标志表示加法或减法是否发生了溢出PFParity Flag偶校验标志用于检查结果是否具有偶数个 1DFDirection Flag方向标志用于字符串操作时的方向控制增量或减量AFAuxiliary Carry Flag辅助进位标志用于 BCD 运算1.3.3fs寄存器作用fs 用来定位当前线程的线程环境块 TEBThread Environment Blockfs:[0]存储当前线程 TEB 的地址1.3.4 TEB线程环境块是 Windows 为每一个线程创建的数据结构。在 32 位 Windows 中TEB 结构大致如下typedefstruct_TEB{NT_TIB NtTib;// 0x0000 TIB用于线程基础信息CLIENT_ID ClientId;// 0x0020 当前线程的 ClientId包含进程 ID 和线程 IDPVOID ThreadLocalStoragePointer;// 0x002C 指向线程局部存储TLS的指针PVOID ProcessEnvironmentBlock;// 0x0030 指向进程环境块PEB的指针ULONG LastErrorValue;// 0x0034 最近错误值// 其他字段...}TEB;1.3.5 PEB进程环境块一个进程是由多个线程构成的在 32 位 Windows 中TEB 结构大致如下typedefstruct_PEB{UCHAR BeingDebugged;// 0x002 是否正在调试 这两个都是用来检测的ULONG NtGlobalFlag;// 0x068 Windows调试相关全局标志// ...}PEB;1.4dbg快捷键快捷键功能F9运行程序直到断点运行F7进入函数内部步入F8执行当前指令不进入函数步过F4运行到光标位置F12暂停程序Ctrl F2重启程序清除全部断点F2设置/取消断点Ctrl G跳转到地址Space修改汇编代码Enter跳转查看当前光标所在的地址添加注释 / -进函数/出函数二. 汇编指令2.1 数据传输指令操作符功能示例mov将数据从源传输到目的位置mov eax, ebxpush将数据压入栈push eaxpop从栈中弹出数据到目的位置pop eaxxchg交换两个操作数的值xchg eax, ebxlea取地址lea eax, [ebx4]中括号代表取地址2.2 算数运算指令操作符功能示例add加法add eax, ebxsub减法sub eax, ecxmul无符号乘法mul ecximul有符号乘法imul eax, ecxdiv无符号除法div ecxidiv有符号除法idiv ecxinc自增1inc eaxdec自减1dec eax指令类型输入输出mul ecx无符号乘法EAX × ECXEDX:EAXimul ecx有符号乘法EAX × ECXEDX:EAXimul eax, ecx有符号乘法EAX × ECXEAXimul eax, ecx, 10有符号乘法ECX × 10EAXdiv ecx无符号除法EDX:EAX ÷ ECXEAX商EDX余数idiv ecx有符号除法EDX:EAX ÷ ECXEAX商EDX余数2.3 位运算指令2.3.1 逻辑运算指令指令格式功能说明特殊要求andand target, source按位与1 1 1其余为0结果保存到target操作数要求同MOVoror target, source按位或11 11xorxor target, source按位异或相同为0不同为1结果保存到target同上notnot target按位非1 → 00 → 1结果保存到target操作数不能是立即数注意事项通常使用AND指令对指定位清0通常使用OR指令对指定位置1通常使用NOT指令将某个数据取反码再加1就得到补码通常使用XOR指令来取反某位非运算对标志位不影响其余指令对标志均会产生影响2.3.2 移位运算非循环移位运算指令格式类型移动方向补位方式标志位影响SHL逻辑左移SHL eax, 1无符号数左移低位补0最高位移入 CF移位后若 CF ≠ 最高位则 OF1否则 OF0SAL算术左移SAL eax, 1有符号数左移低位补0最高位移入 CF与 SHL 相同操作完全相同SHR逻辑右移SHR eax, 1无符号数右移高位补0最低位移入 CF—SAR算术右移SAR eax, 1有符号数右移高位补符号位原最高位最低位移入 CF—循环移位指令格式名称功能说明ROLROL eax, 1循环左移不带进位最高位移入 CF同时循环移回最低位RORROR eax, 1循环右移不带进位最低位移入 CF同时循环移回最高位RCLRCL eax, 1带进位循环左移最高位移入 CFCF 原值移入最低位RCRRCR eax, 1带进位循环右移最低位移入 CFCF 原值移入最高位2.4 逻辑比较指令cmpcmp eax, ebx # eax - ebxtesttest eax, ebx # eax ebx 按位与都是不保存结果只根据结果修改标志寄存器中的标志位。2.5 控制转移指令操作符功能示例jmp无条件跳转jmp 0x00401000call调用子程序call 0x00401000ret返回到调用点retje / jz如果相等ZF 置位跳转je 0x00401020jne / jnz如果不等ZF 未置位跳转jne 0x00401020jg如果大于跳转jg 0x00401020jl如果小于跳转jl 0x00401020jge如果大于等于跳转jge 0x00401020jle如果小于等于跳转jle 0x00401020loop循环跳转loop 0x00401020int调用中断int 0x80iret从中断返回iret巧计跳转zeroequalnotgreatless2.6 栈操作指令指令功能描述栈指针变化ESPPUSH将寄存器值、立即数或内存操作数压入栈顶。例如PUSH EAX、PUSH 5ESP - 4POP将栈顶值弹出并存入寄存器或内存操作数。例如POP EAXESP 4PUSHAD按顺序将通用寄存器EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI的值压入栈ESP - 32POPAD按顺序从栈中弹出值恢复通用寄存器EDI、ESI、EBP、ESP跳过、EBX、EDX、ECX、EAXESP 32PUSHFD将 32 位标志寄存器EFLAGS压入栈ESP - 4POPFD从栈中弹出值并恢复到 32 位标志寄存器EFLAGSESP 4CALL调用子程序将当前指令的返回地址压入栈顶然后跳转到目标地址ESP - 4RET从栈中弹出返回地址并跳转到该地址ESP 4ENTER设置栈帧将当前EBP压入栈然后设置新的EBP并为局部变量分配空间。ESP - 局部变量大小LEAVE恢复栈帧将EBP的值恢复到ESP然后弹出原来的EBP。mov esp, ebp; pop ebpESP 局部变量大小INT imm8软中断将标志寄存器、代码段CS和指令指针EIP压入栈然后跳转到中断向量表中的处理程序地址。ESP - 12IRET中断返回从栈中弹出标志寄存器、代码段CS、指令指针EIP恢复中断前状态。ESP 122.7 字符串操作指令字符串指令的一个共同特点通常不需要把源地址、目标地址直接写出来而是默认使用ESI、EDI。32 位模式下ESI → 源字符串 EDI → 目标字符串 ECX → 重复次数核心指令功能主要作用MOVSB/MOVSW/MOVSD字符串传送内存 → 内存CMPSB/CMPSW/CMPSD字符串比较比较两段内存SCASB/SCASW/SCASD字符串扫描EAX 与内存比较LODSB/LODSW/LODSD加载字符串内存 → EAXSTOSB/STOSW/STOSD存储字符串EAX → 内存B Byte 1字节 W Word 2字节 D Double Word 4字节这些命令常也与rep重复搭配使用2.8 浮点运算指令FPU 是硬件单元 → x87 是传统浮点指令集 → SSE 是基于 XMM 寄存器的 SIMD 浮点指令集。1. FPUFPU浮点运算单元专门处理浮点数运算。主要功能加、减、乘、除、开方、三角函数等。传统 x86 中 FPU 曾是独立协处理器80486 起集成到 CPU 内部。核心寄存器ST0ST78 个80 位浮点寄存器以栈结构组织。状态寄存器记录 FPU 状态和 C0C3 标志。控制寄存器控制精度、舍入方式等。2. x87x87早期 x86 的浮点指令集主要操作ST0ST7。采用浮点寄存器栈。常见指令FLD/FST加载 / 存储FADD/FSUB加 / 减FMUL/FDIV乘 / 除FCOM/FUCOM比较最大特点支持80 位扩展精度。3. SSE**SSE **Streaming SIMD ExtensionsSIMD 扩展指令集。使用XMM 128 位寄存器。可以同时处理多个浮点数PSPacked Single多个32 位单精度SDScalar Double单个64 位双精度相比 x87不采用寄存器栈可以并行处理多个数据更适合多媒体、游戏、音视频和高性能计算。三. 函数3.1 嵌套栈结构空函数汇编; 函数头 push ebp ; 保存调用者函数的 ebp mov ebp esp ; 设置当前栈帧基值 ; 执行完上面两行时ebp4是返回地址ebp8是第一个参数ebp-xxx都是局部数据 ; 返回值保存在eax中 ; 函数尾 leave ; mov esp, ebp; pop ebp ret空函数嵌套push ebp mov ebp esp push xxx ; 参数入栈 call xxx ; 跳转到函数并把下一条指令的地址压入栈中 leave ret ; 会回到执行call时保存的下一条语句的地址栈结构Address Data 描述 Ox0018FF00 [局部变量2] ← EBP - 8 低地址栈顶方向 Ox0018FF04 [局部变量1] ← EBP - 4 Ox0018FF08 [保存的EBP] ← EBP当前栈帧基址 Ox0018FF0C [返回地址] ← EBP 4 Ox0018FF10 [参数1 (a)] ← EBP 8 Ox0018FF14 [参数2 (b)] ← EBP 0xC 高地址栈底方向3.2 调用约定cdeclC调用约定push x push x call func add esp, 8 ; 平衡堆栈外平栈8对应两个参数 func: push ebp mov ebp esp ... leave retstacall标准调用约定push x push x call func func: push ebp mov ebp esp ... leave retn 8 ; 平衡堆栈内平栈8对应两个参数fastcallmov ecx, x ; 前两个参数放在ecx和edx后面的依次入栈 mov edx, x push x call func func: push ebp mov ebp esp ... leave retn 4 ; 平衡堆栈内平栈4对应那一个push的参数thiscallC成员函数调用mov ecx, obj_ptr ; this指针存入ecx push x push x call func add esp, 8 ; 平衡堆栈外平栈8对应两个参数 func: push ebp mov ebp esp ... leave ret ; 可以是retn 8可内可外
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻