日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

硬编码学习笔记(一)—— 经典定长指令

發(fā)布時(shí)間:2025/3/21 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 硬编码学习笔记(一)—— 经典定长指令 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

硬編碼學(xué)習(xí)筆記(一)—— 經(jīng)典定長(zhǎng)指令

  • 前言
  • 指令結(jié)構(gòu)
  • 符號(hào)說明
    • 尋址符號(hào)
    • 操作數(shù)符號(hào)
    • 上標(biāo)符號(hào)
  • One-Byte Opcode Map
  • 經(jīng)典定長(zhǎng)指令:修改寄存器
      • 0x40~0x47
      • 0x48~0x4F
      • 0x50~0x57
      • 0x58~0x5F
      • 0x90~0x97
      • 0xB0~0xB7
      • 0xB8~0xBF
  • 經(jīng)典定長(zhǎng)指令:修改EIP
      • 0x70~0x7F
      • 0x0F80~0x0F8F
      • 0xE0
      • 0xE1
      • 0xE2
      • 0xE3
      • 0xE8
      • 0xE9
      • 0xEA
      • 0xEB
      • 0xC2
      • 0xC3
      • 0xCA
      • 0xCB

前言

本次學(xué)習(xí)僅基于intel x86模式

指令結(jié)構(gòu)

描述:對(duì)于任何一條指令,都由以下幾部分組成,但不是每部分都必須存在
長(zhǎng)度:最短1個(gè)字節(jié),最長(zhǎng)15個(gè)字節(jié)
Instruction Prefixes:指令前綴
Opcode: 主操作碼
ModR/M:在內(nèi)存中引用一個(gè)操作數(shù)的許多指令都有一個(gè)尋址方式的指定符字節(jié)(稱為ModR/M字節(jié))跟隨在主操作碼之后
SIB:ModR/M字節(jié)的某些編碼需要第二個(gè)尋址字節(jié)(SIB字節(jié))
Displacement:一些尋址方式包含緊跟ModR/M字節(jié)(或者SIB字節(jié),如果有的話)的位移
Immediate:立即數(shù)

符號(hào)說明

尋址符號(hào)

符號(hào)意義
A直接尋址
C控制寄存器
D調(diào)試寄存器
E寄存器/內(nèi)存
FEFLAGS/RFLAGS寄存器
G通用寄存器
I立即數(shù)
J要添加到指令指針寄存器的相對(duì)偏移量
MModR/M字節(jié)可能僅指向內(nèi)存。
NMMX 技術(shù)寄存器
O該指令沒有ModR/M字節(jié)。操作數(shù)的偏移量在指令中被編碼為一個(gè)字或雙字(取決于地址大小屬性)。
PModR/M字節(jié)的reg字段選擇一個(gè)打包的四字MMX技術(shù)寄存器
QModR/M字節(jié)跟隨操作碼并指定操作數(shù)。該操作數(shù)要么是MMX技術(shù)寄存器,要么是內(nèi)存地址。
RModR/M字節(jié)的R/M字段可能僅指一個(gè)通用寄存器
SModR/M字節(jié)的reg字段選擇一個(gè)段寄存器
UModR/M字節(jié)的R/M字段選擇一個(gè)128位的XMM寄存器。
VModR/M字節(jié)的reg字段選擇一個(gè)128位的XMM寄存器。
WModR/M字節(jié)跟隨操作碼并指定操作數(shù)。操作數(shù)要么是一個(gè)128位的XMM寄存器要么是一個(gè)內(nèi)存地址。
X由DS:rSI寄存器對(duì)尋址的內(nèi)存
Y由ES:rDI寄存器對(duì)尋址的內(nèi)存

操作數(shù)符號(hào)

符號(hào)意義
a內(nèi)存中的兩個(gè)單字操作數(shù)或內(nèi)存中的兩個(gè)雙字操作數(shù),具體取決于操作數(shù)大小屬性(僅由BOUND指令使用)
b字節(jié)
c字節(jié)/字
d雙字
dq四字
p32位/48位/80位指針
pd128位封裝的雙精度浮點(diǎn)數(shù)據(jù)
pi雙四字,MMX技術(shù)寄存器(例如:mm0)
ps128位封裝的單精度浮點(diǎn)數(shù)據(jù)
q四字
s6字節(jié)或10字節(jié)的偽描述符
ss128位打包的單精度浮點(diǎn)數(shù)據(jù)的標(biāo)量元素
si雙字整數(shù)寄存器(例如:eax)
v字、雙字或四字(取決于當(dāng)前CPU的模式)
w
z16位操作數(shù)大小的字或32位或64位操作數(shù)大小的雙字

上標(biāo)符號(hào)

符號(hào)意義
1AModR/M字節(jié)的第5、4和3位用作操作碼擴(kuò)展
1B使用0F0B操作碼(UD2指令)或0FB9H操作碼時(shí),故意嘗試生成無效的操作碼異常(#UD)
1C在Pentium III處理器中添加的一些指令可以使用相同的雙字節(jié)操作碼。如果指令有變化,或者操作碼代表不同的指令,則使用ModR/M字節(jié)來區(qū)分指令。
i64該指令無效或在64位模式下不可編碼。40到4F(單字節(jié)INC和DEC)是64位模式下的REX前綴組合(對(duì)INC和DEC使用FE/FF Grp 4和5)。
o64指令僅在64位模式下可用。
d64當(dāng)處于64位模式時(shí),指令默認(rèn)為64位操作數(shù)大小,并且不能對(duì)32位操作數(shù)大小進(jìn)行編碼。
f64在64位模式下,操作數(shù)大小被強(qiáng)制為64位操作數(shù)大小(在64位模式下,該指令會(huì)忽略改變操作數(shù)大小的前綴)。

One-Byte Opcode Map


經(jīng)典定長(zhǎng)指令:修改寄存器

0x40~0x47

指令長(zhǎng)度:共1個(gè)字節(jié)

40 INC EAX 41 INC ECX 42 INC EDX 43 INC EBX 44 INC ESP 45 INC EBP 46 INC ESI 47 INC EDI

0x48~0x4F

指令長(zhǎng)度:共1個(gè)字節(jié)

48 DEC EAX 49 DEC ECX 4A DEC EDX 4B DEC EBX 4C DEC ESP 4D DEC EBP 4E DEC ESI 4F DEC EDI

0x50~0x57

指令長(zhǎng)度:共1個(gè)字節(jié)

50 PUSH EAX 51 PUSH ECX 52 PUSH EDX 53 PUSH EBX 54 PUSH ESP 55 PUSH EBP 56 PUSH ESI 57 PUSH EDI

0x58~0x5F

指令長(zhǎng)度:共1個(gè)字節(jié)

58 POP EAX 59 POP ECX 5A POP EDX 5B POP EBX 5C POP ESP 5D POP EBP 5E POP ESI 5F POP EDI

0x90~0x97

指令長(zhǎng)度:共1個(gè)字節(jié)

90 NOP //XCHG EAX, EAX 91 XCHG EAX,ECX 92 XCHG EAX,EDX 93 XCHG EAX,EBX 94 XCHG EAX,ESP 95 XCHG EAX,EBP 96 XCHG EAX,ESI 97 XCHG EAX,EDI

0xB0~0xB7

指令長(zhǎng)度:共2個(gè)字節(jié)

B0 00 MOV AL,0x0 B1 01 MOV CL,0x1 B2 02 MOV DL,0x2 B3 03 MOV BL,0x3 B4 04 MOV AH,0x4 B5 05 MOV CH,0x5 B6 06 MOV DH,0x6 B7 07 MOV BH,0x7

0xB8~0xBF

指令長(zhǎng)度:共5個(gè)字節(jié)

B8 00 00 00 10 MOV EAX,0x10000000 B9 01 00 00 10 MOV ECX,0x10000001 BA 02 00 00 10 MOV EDX,0x10000002 BB 03 00 00 10 MOV EBX,0x10000003 BC 04 00 00 10 MOV ESP,0x10000004 BD 05 00 00 10 MOV EBP,0x10000005 BE 06 00 00 10 MOV ESI,0x10000006 BF 07 00 00 10 MOV EDI,0x10000007

經(jīng)典定長(zhǎng)指令:修改EIP

0x70~0x7F

指令長(zhǎng)度:共2個(gè)字節(jié)
偏移量:1個(gè)字節(jié)
當(dāng)偏移量<0x80時(shí):EIP = 當(dāng)前指令地址+當(dāng)前指令長(zhǎng)度+偏移量
當(dāng)偏移量>0x80時(shí):EIP = 當(dāng)前指令地址+當(dāng)前指令長(zhǎng)度-偏移量

70 JO 71 JNO 72 JB/JNAE/JC 73 JNB/JAE/JNC 74 JZ/JE 75 JNZ/JNE 76 JBE/JNA 77 JNBE/JA 78 JS 79 JNS 7A JP/JPE 7B JNP/JPO 7C JL/JNGE 7D JNL/JGE 7E JLE/JNG 7F JNLE/JG

0x0F80~0x0F8F

指令長(zhǎng)度:共6個(gè)字節(jié)
偏移量:4個(gè)字節(jié)
EIP = 當(dāng)前指令地址+當(dāng)前指令長(zhǎng)度+偏移量

0F80 JO 0F81 JNO 0F82 JB/JNAE/JC 0F83 JNB/JAE/JNC 0F84 JZ/JE 0F85 JNZ/JNE 0F86 JBE/JNA 0F87 JNBE/JA 0F88 JS 0F89 JNS 0F8A JP/JPE 0F8B JNP/JPO 0F8C JL/JNGE 0F8D JNL/JGE 0F8E JLE/JNG 0F8F JNLE/JG

0xE0

指令長(zhǎng)度:共2個(gè)字節(jié)

LOOPNE/LOOPNZ Ib(Jb)

當(dāng)ZF==0&&ECX!=0時(shí):EIP=當(dāng)前指令地址+當(dāng)前指令長(zhǎng)度+Ib;ECX=ECX-1

0xE1

指令長(zhǎng)度:共2個(gè)字節(jié)

LOOPE/LOOPZ Ib(Jb)

當(dāng)ZF==1&&ECX!=0時(shí):EIP=當(dāng)前指令地址+當(dāng)前指令長(zhǎng)度+Ib;ECX=ECX-1

0xE2

指令長(zhǎng)度:共2個(gè)字節(jié)

LOOP Ib(Jb)

當(dāng)ECX!=0時(shí):EIP=當(dāng)前指令地址+當(dāng)前指令長(zhǎng)度+Ib;ECX=ECX-1

0xE3

指令長(zhǎng)度:共2個(gè)字節(jié)

JrCXZ Ib(Jb) //在32位模式中,rCX為ECX

當(dāng)ECX==0時(shí):EIP=當(dāng)前指令地址+當(dāng)前指令長(zhǎng)度+Ib

0xE8

指令長(zhǎng)度:共5個(gè)字節(jié)

CALL Id(Jd)

下一條指令地址入棧;EIP=當(dāng)前指令地址+當(dāng)前指令長(zhǎng)度+Id

0xE9

指令長(zhǎng)度:共5個(gè)字節(jié)

JMP Id(Jd)

EIP=當(dāng)前指令地址+當(dāng)前指令長(zhǎng)度+Id

0xEA

指令長(zhǎng)度:共7個(gè)字節(jié)

JMP Ap //Ap為六字節(jié)長(zhǎng)度的直接地址 JMP CS:Id //將Ap中的高2位賦值給CS,低4位賦值給EIP

0xEB

指令長(zhǎng)度:共2個(gè)字節(jié)

JMP Ib(Jb)

EIP=當(dāng)前指令地址+當(dāng)前指令長(zhǎng)度+Ib

0xC2

指令長(zhǎng)度:共3個(gè)字節(jié)

RET Iw //POP EIP;ESP=ESP+Iw

0xC3

指令長(zhǎng)度:共1個(gè)字節(jié)

RET //POP EIP

0xCA

指令長(zhǎng)度:共1個(gè)字節(jié)

RETF //POP EIP;POP CS

0xCB

指令長(zhǎng)度:共3個(gè)字節(jié)

RETF Iw //POP EIP;POP CS;ESP=ESP+Iw

總結(jié)

以上是生活随笔為你收集整理的硬编码学习笔记(一)—— 经典定长指令的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。