x86指令解析
Ross7
linux学院派代表~~~
展开
-
X86 PUSH指令详解
SDM指令功能描述(PUSH) 总体描述: 先递减栈指针,然后把指令中的SRC操作数的内容放在栈顶(也就是ss:(r/e)sp),关于地址和操作数等的宽度规则如下: 地址宽度:取决于当前cs指向的代码段的D flag,可以被prefix 0x67重载。 操作数宽度:取决于当前cs指向的代码段的D flag,可以被prefix 0x66或REX.W重载。操作数的宽度同时决定了栈指针的递减值。原创 2017-05-26 10:38:58 · 6991 阅读 · 0 评论 -
X86(X64) 读取rflags的方法
工作中遇到的问题,需要读取rflags的值然后显示的打印出来。翻了SDM的指令卷,找到了LAHF指令,这个指令可以把rflags的值写入AH寄存器中,那么问题来了,AH寄存器只有8位,但是rflags在保护模式或者x64模式是32位/64位的,来看下SDM的说明可知,确实只截取了rflags的低8位,intel这么做想必也是因为低8位比较常用,编写的代码如下:#incl...原创 2019-04-24 14:26:58 · 1336 阅读 · 1 评论 -
X86 指令格式及编码解析 (64Bit Mode)
首先,64Bit Mode的指令格式,基础是IA32 Mode的指令格式,二者的主要区别在于REX Prefix的加入,也就是intel实际上是在IA32的指令基础上扩展成的64Bit Mode指令.所以看这篇文章之前必须了解IA32的编码,如果不了解可以看我写的IA32指令格式文章,链接 https://blog.csdn.net/ross1206/article/details/81661...原创 2018-08-14 14:04:31 · 3016 阅读 · 0 评论 -
X86 指令格式及编码解析 (IA32 Mode)
IA32-Mode SMD指令格式 X86指令由:前缀字节prefix (非必需) 操作码opcode (必须) 内存/寄存器操作数字节ModR/M (非必需) 索引寻址描述字节SIB (非必需) 常数偏移字节/半字/字Displacement (非必需) 立即数字节/半字/字 Immediate (非必需) prefix解析 种类 名...原创 2018-08-14 10:31:27 · 9880 阅读 · 0 评论 -
X86 XRSTOR指令详解
1.SDM指令功能描述(BSWAP) SDM总体描述: RFBM[0..7] 是xcr0 & eax的值 XMODIFIED[0..7]指定了fpu相关的寄存器是否被更改过 SDM没有说明这个隐式寄存器如何更改 XINUES[0..7]指定了fpu相关寄存器的状态不是是init XRSTOR有两种”形式”–standard或compacted 由XCOMP_BV的第63位来指定 0 –原创 2017-09-20 11:52:21 · 1419 阅读 · 0 评论 -
X86 XSAVEOPT 指令详解
xsaveopt指令是xsave的优化版,常用于kernel在进程切换的时候保存进程使用fpu寄存器现场,主要分3个域 X87 SSE AVX AVX5121.SDM指令功能描述(XSAVEOPT) 实现一个完整或者部分的xsave,将相应寄存器的值存储在目的操作数中. EDX:EAX作为隐式参数是一个指令mask,功能是和XCR0做一个逻辑and操作得到结果是RFBM. XINUSE的描述在第原创 2017-09-14 15:12:23 · 3659 阅读 · 0 评论 -
X86 LSS指令详解
SDM指令功能描述(LSS) 总体描述: 用32位或48位或64位的数据加载16位SS段选择符和16或32位或64位的通用寄存器值,其中通用寄存器在目的操作数中。 LSS (16or32or64)通用寄存器, (32or48or64)内存变量的地址伪代码:64位模式:if(selector is NULL && ((RPL==3) or (RPL!=3 && RPL!=CPL))){#原创 2017-05-23 16:44:42 · 3731 阅读 · 0 评论 -
X86 BSWAP指令详解
SDM指令功能描述(BSWAP) 总体描述: 以字节为单位,把32/64位寄存器的值按照低和高的字节交换(详见伪代码)。此指令默认的operand size是32bit,如果要使用64位寄存器,那么需要使用REX.W前缀;如果需要使用寄存器R8-R15,那么需要使用REX.R前缀。注意:BSWAP指令不支持16位模式伪代码TEMP = DEST;if(64bit-mode and ope原创 2017-06-09 17:28:06 · 3894 阅读 · 0 评论 -
X86 POPF/POPFD指令详解
SDM指令功能描述(POPF/POPFD)总体描述: POPF/POPFD/POPFQ指令从RSP/ESP/SP指向的堆栈中(栈顶)取出OperandSize大小的数据加载至RFLAGS/EFLAGS/FLAGS寄存器,并将堆栈指针寄存器RSP/ESP/SP增加对应OperandSize大小。能被该指令影响的FLAGS标记位,取决于当前指令所处的模式。当处于保护模式下且当前特权级别为0时,除了R原创 2017-06-09 17:23:12 · 5494 阅读 · 0 评论 -
X86 XCHG指令详解
SDM指令功能描述(XCHG) XCHG指令,双操作数指令,用于交换src和dest操作数的内容。其中,src和dest可以是两个通用寄存器,也可以是一个寄存器和一个memory位置。在XCHG执行期间,memory操作数被引用时,处理器自动实现locking protocol,不依赖LOCK prefix或IOPL字段(I/O privilege level field,EFR寄存器中的I原创 2017-06-03 16:04:21 · 22535 阅读 · 1 评论 -
X86 LEA指令详解
1.SDM指令功能描述(LEA) LEA 总体描述: 从第二个操作数(源操作数)计算有效地址,并将结果存入第一个操作数(目的操作数)。源操作数是指定了一种访存操作的内存地址,目的操作数为一个通用寄存器。地址大小和操作数大小都会影响该指令的结果,操作数大小被指令中指定的寄存器大小决定,地址大小由代码段描述符中的属性指定。如果地址位数大于操作数位数,计算结果将被截断至操作数指定的宽度并存入寄存器中原创 2017-05-22 16:53:06 · 13399 阅读 · 0 评论 -
X86 LGS/LFS指令详解
SDM指令功能描述(LGS/LFS) 总体描述: 用32位或48位或64的数据加载16位GS/FS段选择符和16或32位的通用寄存器值,其中通用寄存器在目的操作数中。 LGS/LFS (16or32or64)通用寄存器, (32or48or64)内存变量的地址 伪代码: 64位模式: if(selector is no NULL) { if((selector指定的偏移大于指原创 2017-05-22 15:55:16 · 1028 阅读 · 0 评论 -
X86 PUSHF/PUSHFD/PUSHFQ 指令详解
SDM指令功能描述(PUSHF/PUSHFD/PUSHFQ) 总体描述: 根据操作数宽度的不同: 32: 栈指针递减4,然后压入eflags寄存器的值 16: 栈指针递减2,然后压入eflags的低16位 64: 栈指针递减8,然后压入rflags寄存器的值 当把eflags复制到栈顶的时候,VM(bit16)和RF(bit17)位不会被复制,而 会用 0填充**在虚808原创 2017-06-01 17:07:12 · 9865 阅读 · 0 评论 -
X86 PUSHA指令详解
SDM指令功能描述(PUSHA) 总体描述: 按照顺序将general-purpose寄存器压到栈上。按照当前的操作数宽度属性: 32: EAX ECX EDX EBX ESP EBP ESI EDI 16: AX CX DX BX SP BP SI DI在实模式下,如果ESP/SP的值是1 3 5的时候,使用了PUSHA或PUSHAD指令则会触发#SS异常注:D/B flag在代码段中原创 2017-06-01 14:51:42 · 2949 阅读 · 0 评论 -
x86 LES指令解析
1. SDM指令功能描述(LES) 总体描述:用32位或48位的数据加载16位ES段选择符和16或32位的通用寄存器值,其中通用寄存器在目的操作数中。LES (16or32)通用寄存器, (32or48)内存变量的地址 注意:LES指令不支持64位模式2. 伪代码: 64位模式: #UD 32位模式: i原创 2017-05-16 16:17:54 · 2672 阅读 · 0 评论 -
X86 LDS指令解析
DM指令功能描述(LDS)总体描述:用32位或48位的数据加载16位DS段选择符和16或32位的通用寄存器值,其中通用寄存器在目的操作数中。LDS (16or32)通用寄存器, (32or48)内存变量的地址注意:LDS指令不支持64位模式伪代码:64位模式:#UD32位模式:if(selector is not NULL){ if((selector指向gdt或者ldt超出了gdt或ld原创 2017-05-17 10:54:44 · 4995 阅读 · 0 评论 -
X86 MOVSB MOVSW MOVSD MOVSQ 指令详解
SDM指令功能描述(MOVS/MOVSB/MOVSW/MOVSD/MOVSQ) MOVS/MOVSB/MOVSW/MOVSD/MOVSQ)总体描述: 从DS:SI(16-bit)/DS:ESI(32-bit)/RSI(64-bit)指示的地址中复制一个byte/word/dword/qword到ES:DI(16-bit)/ES:EDI(32-bit)/RDI(64-bit)指示的地址中。 (R原创 2017-05-26 11:36:01 · 4195 阅读 · 0 评论 -
关于代码链接地址分配的理解(持续更新)
最近在写一个x86下的boot loader,由于是基于legacy bios的,所以要使用real mode编程,编写汇编文件,用as编译生成目标文件,再用ld链接器手动链接,把代码段和数据段指定到合适的位置。而这个“合适的位置”,引发了我的思考。代码如下供参考。.code16.data.global _startBIOS_COPY_ADDR = 0x7c0 ...原创 2019-07-24 14:54:46 · 525 阅读 · 0 评论