Ia-32寄存器总结

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

EAX:累加寄存器

ECX:计数寄存器,常用于计数

EDX :数据寄存器,常用于数据传递

EBX :基址寄存器,常用于地址索引

ESP :ESP为堆栈指针,指向当前栈顶

EBP :EBP为帧指针,当前活动记录的顶部

ESI :变址寄存器,源地址指针,存储单元在段内的偏移量,

EDI :变址寄存器目标地址指针

EIP :指令寄存器,存放当前指令的下一条指令的地址

ES:附加段寄存器

CS:代码段寄存器

SS:堆栈段寄存器

DS:数据段寄存器

FS:寄存器指向当前活动线程的TEB结构

000 指向SEH链指针

004 线程堆栈顶部

008 线程堆栈底部

00C SubSystemTib

010 FiberData

014 ArbitraryUserPointer

018 FS段寄存器在内存中的镜像地址

020 进程PID

024 线程ID

02C 指向线程局部存储指针

030 PEB结构地址(进程结构)

034 上个错误号

GS:全局寄存器

EFL:标志位寄存器,各标志位的含义如下图,

DF:是控制标志位为方向标志,在串处理指令中控制处理信息的方向用。当DF为1时,每次操作后使变址寄存器SI和DI减小,这样就使串处理从高地址向低地址方向处理。当DF为0时相反.

TF当TF被置为1时,CPU进入单步执行方式,即每执行一条指令,产生一个单步中断请求。这种方式主要用于程序的调试

ZF表示目的操作数结果为零

AF表示(AL为一个字节)相加进行到一半(低4位)有没有向另一半(高4位)进位,也可以表示是否借位(减法)

PF表示为偶数

CF表示已经发生进位,也可以表示借位

操作标志位寄存器汇编指令

LAHF 标志寄存器传送,把标志装入AH.

SAHF 标志寄存器传送,把AH内容装入标志寄存器.

PUSHF 标志入栈.

POPF 标志出栈.

PUSHD 32位标志入栈.

POPD 32位标志出栈.

浮点寄存器:(80位)

ST0

ST1

ST2

ST3

ST4

ST5

ST6

ST7

FST :协处理器状态寄存器

FCW:浮点控制寄存器具体参考/design/processor/manuals/253665.pdf

MM0:多媒体指令寄存器

MM1

MM2

MM3

MM4

MM5

MM6

MM7

DR0 :调试寄存器

DR1

DR2

DR3

DR4

DR5

DR6

DR7

CR0:控制寄存器

CR1

CR2

CR3

CR4

CR5

CR6

CR7

TR0 :任务寄存器

TR1

TR2

TR3

TR4

TR5

TR6

TR7

XMM0:单指令,多数据寄存器

FS:

得到KERNEL32.DLL基址的方法

assume fs:nothing ;打开FS寄存器

mov eax,fs:[30h] ;得到PEB结构地址

mov eax,[eax + 0ch] ;得到PEB_LDR_DA TA结构地址

mov esi,[eax + 1ch] ;InInitializationOrderModuleList

lodsd ;得到KERNEL32.DLL所在LDR_MODULE结构的InInitializationOrderModuleList地址

mov edx,[eax + 8h] ;得到BaseAddress,既Kernel32.dll基址

获得pted结构汇编代码

TEB *pteb=NULL;

__asm mov eax,fs:[18h]

__asm mov pteb,eax

对于协处理器中状态寄存器的内容,程序员可用指令FSTSW把其值送到内存单元中。如果当前使用的是80287及其以后的协处理器,那么,可用指令“FSTSW AX”把该状态寄存器的值传送给通用寄存器AX。一旦状态寄存器的值复制到内存或AX中,那么,就可对其各位进行分析,并可检测出当前协处理器的工作状态。

对于80287协处理器,它还可通过I/O地址00FAH~00FFH来实现其与CPU之间的数据交换,而80387~Pentium系列芯片,则是通过I/O地址800000FAH~800000FFH来实现这两者之间的数据交换。

当状态寄存器的内容传给AX之后,一般可用下面二种方法来检测协处理器的状态。

方法1:用TEST指令来检测其相应的状态位。

例11.3 检测是否有“0作除数”的错误。

FDIV DA TA1 ;用协处理器中堆顶数据去除DA TA1

FSTSW AX ;把状态寄存器的值传送给AX

TEST AX, 4 ;测试第2位,即:检测ZE是否为1

JNZDIV_ERR

例11.4 检测是否有“非法操作数”的错误。

FSQRT;求协处理器中堆顶数据的平方根

FSTSW AX

TESTAX, 1;测试第0位,即:检测IE是否为1

JNZSQRT_ERR

方法2:用SAHF指令把AX的低字节传送给CPU的标志位寄存器,然后再用条件转移指令来完成相应的检测。

例11.5 检测内存单元的数据与协处理器堆顶数据之间的大小关系。

FCOMDA TA1;内存单元DA TA1的值与协处理器堆顶数据进行比较

FSTSW AX

SAHF;把AX的低字节存入CPU的状态寄存器

JEST_EQUAL ;具体大小关系的决定可见表11.2中的“FCOM”

JBST_BELOW

JAST_ABOVE

相关文档
最新文档