window调试学习4——汇编语言基础知识

这里说的是x86汇编指令集。

格式如下:

instruction 【操作数1】,【操作数2】

这里,操作数1和操作数2是指令所使用的数据,操作数1是指令的目标操作数。结果是,如果有一个操作数会被指令修改,那么,它往往就是操作数1。

操作数可以是常数、CPU寄存器以及内存单元,到底使用哪种数据决定于寻址方式。


dword ptr指的是执行一个双字的指针,等价于C++里的*(DWORD*)。

一个值得注意的寻址约定是,将数直接从一个内存单元移到另一内存单元,在x86的微处理器中是不允许的。使用mov时,至少要使用一个寄存器,或者作为源寄存器,或者作为目标寄存器。


常用指令

mov 将名操作数复制到左操作数

lea 装入有效地址。用来得到局部变量和函数参数的指针

push 将操作数压到堆栈的栈顶

pop 将堆栈的栈顶数弹出到操作数中

pushad 将所有的通用寄存器压到堆栈的栈顶

popad 将堆栈的栈顶数弹出到所有的通用寄存器中

call 调用一个函数。以寄存器和偏移量(例如call [eax+32])来调用函数和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)中。

fst  ST(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等。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值