Ia-32寄存器总结
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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