matlab中24位定长编码,硬编码——经典定长指令

本文详细介绍了x86汇编语言中的经典定长指令,包括PUSH/POP用于修改寄存器的用法,INC/DEC的增减操作,MOVRb/Ib及MOVERX/Id的寄存器与立即数的移动,以及不同条件的跳转指令如JO、JNO、JB等。此外,还涵盖了LOOP系列指令和CALL、JMP的调用与跳转操作,以及RET和RETf的返回指令。这些指令在x86架构的程序控制流和数据处理中起到关键作用。
摘要由CSDN通过智能技术生成

经典定长指令上(修改寄存器)

1、PUSH/POP特点:

0x50 PUSH EAX1、记住32位、16、8位的通用寄存器,按照顺序记住.

0x51 PUSH ECX

0x52 PUSH EDX2、将操作数编码到指令当中

0x53 PUSH EBX

0x54 PUSH ESP

0x55 PUSH EBP

0x56 PUSH ESI

0x57 PUSH EDI

0x58POP EAX

0x59POP ECX

0x5APOP EDX

0x5B POP EBX

0x5C POP ESP

0x5D POP EBP

0x5EPOP ESI

0x5F POP EDI

2、INC/DEC:读表:

0x40 - 0x47INC ERX1、i64/o64/d64

0x48 - 0x4FDEC ERXi64:64位无效

o64:只64位有效

3、MOV Rb, Ib

d64:64位模式下,操作数宽度默认为64位

0xb0 - 0xb7MOV Rb, Ib

4、MOV ERX, Id2、关于寄存器

0xb8 - 0xbFMOV ERX, Id(1) 当操作码需要使用寄存器做为操作数时,寄存器的名字说明其

宽度是64、32、16、8位.

5、XCHG EAX, ERX

(2) eXX 比如 eAX 可以表示 AX EAX

0x90 - 0x97XCHG EAX, ERX

(3) rXX 比如 rAX 可以表示 AX EAX RAX

经典定长指令下(修改EIP)

1、0x70 - 0x7F

条件跳转,后跟一个字节立即数的偏移(有符号),共两个字节。

如果条件成立,跳转到 当前指令地址 + 当前指令长度 + Ib

最大值:向前跳7f,向后跳80

0x70  JO

0x71JNO

0x72JB/JNAE/JC

0x73JNB/JAE/JNC

0x74JZ/JE

0x75JNZ/JNE

0x76JBE/JNA

0x77JNBE/JA

0x78JS

0x79JNS

0x7AJP/JPE

0x7BJNP/JPO

0x7CJL/JNGE

0x7DJNL/JGE

0x7EJLE/JNG

0x7FJNLE/JG

2、0x0F 0x80 - 0x0F 0x8F

条件跳转,后跟四个字节立即数的偏移(有符号),共五个字节。

如果条件成立,跳转到 当前指令地址 + 当前指令长度 + Id

最大值:向前跳7FFFFFFFF,向后跳80000000

0x0F 0x80  JO

0x0F 0x81JNO

0x0F 0x82JB/JNAE/JC

0x0F 0x83JNB/JAE/JNC

0x0F 0x84JZ/JE

0x0F 0x85JNZ/JNE

0x0F 0x86JBE/JNA

0x0F 0x87JNBE/JA

0x0F 0x88JS

0x0F 0x89JNS

0x0F 0x8AJP/JPE

0x0F 0x8BJNP/JPO

0x0F 0x8CJL/JNGE

0x0F 0x8DJNL/JGE

0x0F 0x8EJLE/JNG

0x0F 0x8FJNLE/JG

3、其他指令

0xE0  LOOPNE/LOOPNZ Ib (Jb)共2字节

ECX = ECX - 1  当ZF = 0 && ECX!=0 时跳转到 当前指令地址 + 当前指令长度 + Ib

0XE1     LOOPE/LOOPZ Ib (Jb)共2字节

ECX = ECX - 1  当ZF = 1 && ECX != 0 时跳转到 当前指令地址 + 当前指令长度 + Ib

0XE2LOOP Ib (Jb)共2字节

ECX = ECX - 1  当 ECX!=0 时跳转到 当前指令地址 + 当前指令长度 + Ib

0XE3JrCXZ Ib (Jb) (在32位模式中,rCX为ECX)共2字节

当 ECX = 0 时跳转到 当前指令地址 + 当前指令长度 + Ib

(自己控制步长)

0xE8CALL Id (Jd)  共5字节

CALL指令的下一条指令地址入栈后,跳转到 当前指令地址 + 当前指令长度 + Id

0xE9JMP Id (Jd)共5字节

跳转到 当前指令地址 + 当前指令长度 + Id

8个段寄存器: ES CS SS DS FS GS LDTR TR (顺序固定)

(段寄存器实际是个结构体,共96位,其中仅16位是汇编指令可以访问到的)

0xEAJMP Ap (Ap:六字节长度的直接地址)共7字节

JMP CS:Id  将Ap中的高2位赋值给CS,低4位直接赋值给EIP, 即跳转

004183D7 >    EA 12345678 1B00     JMP FAR 001B:78563412

0xEBJMP Ib (Jb)

跳转到 当前指令地址 + 当前指令长度 + Ib

0xC3 RET共1字节

EIP出栈

0xC2RET Iw共3字节

EIP出栈后,ESP = ESP + Iw

0XCBRETF (return far) 共1字节

出栈8个字节,低4个字节赋值给EIP,高4个字节中低2位赋值给CS

0xCARETF Iw共3字节

出栈8个字节,低4个字节赋值给EIP,高4个字节中低2位赋值给CS后,ESP = ESP + Iw

ret  -> pop eip

retf -> pop eip, pop cs

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值