od界面继
这是寄存器介面上的EFL、ST0、FST分别表示什么呀 这里说的是x86汇编指令集。格式:instruction 操作数1, 操作数2
这里,操作数1和操作数2是指令所使用的数据,操作数1是指令的目标操作数。结果是,如果有一个操作数会被指令修改,那么,它往往就是操作数1。
操作数可以是常数、CPU寄存器以及内存单元,到底使用哪种数据决定于寻址方式。
dword ptr指的是执行一个双字的指针,等价于C++里的*(DWORD*)。
一个值得注意的寻址约定是,将数直接从一个内存单元移到另一内存单元,在x86的微处理器中是不允许的。使用mov时,至少要使用一个寄存器,或者作为源寄存器,或者作为目标寄存器。
常用指令
mov 将名操作数复制到左操作数
lea 装入有效地址。用来得到局部变量和函数参数的指针
push 将操作数压到堆栈的栈顶
pop 将堆栈的栈顶数弹出到操作数中
pushad 将所有的通用寄存器压到堆栈的栈顶
popad 将堆栈的栈顶数弹出到所有的通用寄存器中
call 调用一个函数。以寄存器和偏移量(例如call )来调用函数和C++里的虚函数调用很类似
ret 从一个函数返回。__stdcall调用规范要求如果有返回值,就要将返回值从堆栈的栈顶弹出
leave 是mov ESP、EBP/pop EBP的简写,用来退出函数
add 算术加
sub 算术减
inc 递增操作
dec 递减操作
mul 无符号整数乘法。操作数必须是寄存器或内存单元
imul 有符号整数乘法
div 无符号整数除法。操作数必须是寄存器或内存单元
idiv 有符号整数除法。操作数必须是寄存器或内存单元
and 逻辑与
or 逻辑或
not 逻辑非,使用反码非,与将所有的位单独取反效果相同
neg 非操作,使用补码非。与乘以-1效果相同
xor 导或、一个寄存器和它自身进行异或通常被用来将该寄存器置为0
cmp 比较操作数(使用减法),并置上标志寄存器的相应位。操作数不会被修改
test 比较操作数的位(使用逻辑与),并置上标志寄存器的相应位。操作数不会被修改
jmp 无条件跳转
je 如果相等则跳转
jne 如果不等则跳转
loop 返回到循环的入口,视具体条件而定
nop 空操作,用来填充
int 引发中断。3号中断调用调试器,它经常被当作不会被调用的指令填充到程序中,从而成为一个特殊的空操作
常用CPU寄存器
EAX 通用寄存器,记录函数返回值
EBX 通用寄存器
ECX 通用寄存器,记录指向对象的this指针
EDX 通用寄存器,记录64位函数返回值的高端字
ESI 内存移动和比较操作的源地址寄存器
EDI 内存移动和比较操作的目标地址寄存器
EIP 指令指针(当前执行代码的位置)
ESP 栈指针(当前栈顶的位置)
EBP 栈基址指针(当前栈顶帧的基址)
EFLAGS 记录比较、算术操作的标记位;有时简记为EFL或EFLGS
除了这些寄存器,还有CS(代码段)、SS(堆栈段)、DS(数据段)、ES(附加段)、FS(另一附加段)、GS(另一附加段);但除了FS寄存器外,其他段寄存器在32位Windows调试中不会有什么用。FS寄存器用来指向线程信息块(TIB)。
常用浮点数指令表
fld 将浮点数IN压入ST(0)中。
fild 将整数IN压入ST(0)中。
fldz 将0.0压入ST(0)中。
fld1 将1.0压入ST(0)中。
fstST(0)中的数据以浮点形式存入OUT地址中。
fstp 和fst指令一样,但会执行一次出栈操作。
fist ST(0)数据以整数形式存入OUT地址中。
fistp 和fist指令一样,但会执行一次出栈操作。
fcom 将IN地址数据与ST(0)进行实数比较,影响对应标记位
ftst 比较ST(0)是否为0.0,影响对应标记位
fadd 将IN地址内的数据与ST(0)做加法运算,结果放入ST(0)中
faddp 将ST(N)中的数据与ST(0)中的数据做加法运算,N为0~7中的任意一个,先执行一次出栈操作,然后将相加结果放入ST(0)中保存
其他运算指令和普通指令类似,只需在前面加F即可,如FSUB和FSUBP等。
非常谢谢甲鱼老师
页:
[1]