自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(21)
  • 资源 (1)
  • 收藏
  • 关注

原创 关于代码链接地址分配的理解(持续更新)

最近在写一个x86下的boot loader,由于是基于legacy bios的,所以要使用real mode编程,编写汇编文件,用as编译生成目标文件,再用ld链接器手动链接,把代码段和数据段指定到合适的位置。而这个“合适的位置”,引发了我的思考。代码如下供参考。.code16.data.global _startBIOS_COPY_ADDR = 0x7c0 ...

2019-07-24 14:54:46 499

原创 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 1293 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 2955

原创 X86 指令格式及编码解析 (IA32 Mode)

IA32-Mode SMD指令格式 X86指令由:前缀字节prefix (非必需) 操作码opcode (必须) 内存/寄存器操作数字节ModR/M (非必需) 索引寻址描述字节SIB (非必需) 常数偏移字节/半字/字Displacement (非必需) 立即数字节/半字/字 Immediate (非必需) prefix解析 种类 名...

2018-08-14 10:31:27 9740

原创 CentOS7 使用光盘镜像作为yum源

摘要:  由于很多公司(比如我所在的)的服务器是无法连接外网的,而很多软件需要安装依赖,这个时候使用iso镜像作为yum源成了最方便的选择。 准备:首先,如果是虚拟机,则确认guest有光驱并且处于激活状态,如果是真机则在光驱中插入光盘 :-)建议下载使用 centos7的everything版本的iso,这样内容比较全。 开始:首先进入 /etc/yum.re...

2018-08-01 17:06:07 18683 1

原创 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 1367

原创 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 3514

原创 vim常用设置

vim设置的方法有两种运行的时候用:进入命令行模式写入配置文件 可以写入对所有用户的配置文件也可以写入对单独用户的配置文件 如果是写入对所有用户的配置文件 那么要写入 /etc/vim/vimrc这个文件 如果是写入对单独用户的配置文件 那么要写入 $HOME/.vimrc这个文件 $HOME的值每个用户不同我个人常用的配置 syntax on 语法高亮...

2017-09-08 14:53:12 319

原创 vim实现复制字符串到命令行

很多人都想yank一个vim编辑器正在打开的字符串到命令行,无论是做字符匹配还是别的其他的原因都会有这个需求.在网上找了好多资料最后才整理出来一个方法如图这个地方 我用了可视化赋值v 选择完毕后按y把字符串yank了随后按 / 或 : 退到命令行模式然后按 CTRL-W 这时候命令行会变成 /”别着急 再按一个0 就变成了 yank的那个字符串了~~~

2017-09-08 14:28:21 3829 2

原创 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 3719

原创 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 5356

原创 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 21939 1

原创 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 9631

原创 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 2877

原创 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 4016

原创 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 6848

原创 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 3650

原创 X86 LEA指令详解

1.SDM指令功能描述(LEA) LEA 总体描述: 从第二个操作数(源操作数)计算有效地址,并将结果存入第一个操作数(目的操作数)。源操作数是指定了一种访存操作的内存地址,目的操作数为一个通用寄存器。地址大小和操作数大小都会影响该指令的结果,操作数大小被指令中指定的寄存器大小决定,地址大小由代码段描述符中的属性指定。如果地址位数大于操作数位数,计算结果将被截断至操作数指定的宽度并存入寄存器中

2017-05-22 16:53:06 13288

原创 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 968

原创 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 4917

原创 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 2597

[原创]x86指令解析-legacy

原创文档,里面说明了legacy opcode下的x86指令编码格式已经具体实例 是后续的sse avx等指令格式的基础

2018-08-15

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除