Ia-32寄存器总结
- 格式:doc
- 大小:64.50 KB
- 文档页数:4
IA-32处理器是Intel推出的一系列32位处理器架构,它在计算机硬件中起着至关重要的作用。
IA-32处理器的条件转移指令是其中一个重要的组成部分,它们为计算机程序的流程控制提供了必要的支持。
本文将重点介绍IA-32处理器的条件转移指令,包括其功能、操作方法以及相关注意事项。
一、IA-32处理器的条件转移指令概述条件转移指令是一类用于根据特定条件改变程序执行流程的指令,它们根据条件标志寄存器的状态来决定是否执行跳转。
在IA-32处理器中,条件转移指令通常以"J"开头,后跟特定的条件代码,比如JE (Jump if Equal)、JNE(Jump if Not Equal)等。
这些条件代码根据不同的情况来判断是否进行跳转,从而实现程序流程的灵活控制。
二、IA-32处理器条件转移指令的功能IA-32处理器的条件转移指令主要用于实现程序中的条件分支结构,使程序可以根据不同的条件选择不同的执行路径。
它们可以用于实现循环结构、条件判断、函数调用等,是程序中不可或缺的重要部分。
通过条件转移指令,程序可以实现复杂的逻辑判断和控制流程,从而实现各种不同的功能和算法。
三、IA-32处理器条件转移指令的操作方法条件转移指令的操作方法相对简单直接,它们通常涉及到两个部分:条件判断和跳转目标。
条件判断部分会根据条件标志寄存器(如ZF、SF、CF等)的状态来确定是否满足跳转条件。
根据条件判断的结果,程序将会跳转到特定的跳转目标位置区域执行相应的指令。
在汇编语言中,条件转移指令的语法通常如下:```JE label ; 如果相等则跳转到标号label处执行JNE label ; 如果不相等则跳转到标号label处执行JZ label ; 如果为零则跳转到标号label处执行JG label ; 如果大于则跳转到标号label处执行JMP label ; 无条件跳转到标号label处执行```通过这些简单的指令的组合,程序可以实现复杂的条件控制和跳转逻辑。
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。