汇编 笔记(2)

来源:互联网 发布:tina软件 编辑:程序博客网 时间:2024/05/18 00:10

 

昨天任务:

查找这几个指令用法

neg 取补的指令

sbb 带位减法指令,它利用CF位上记录的借位值

test 测试指令,实现源操作数的按位逻辑与运算工,并按结果设置标志位,但是结果不送往目的地址中,结果影响sf,zf,pf

xor 异或,二进制运算

lea 取得地址(取得第二个参数的地址到前面的寄存器中)

 

//这段代码 ……解释……

neg eax

sbb eax,eax

inc eax

代码的作用:   如果eax初值为0, 则执行上面的代码后,结果为1.
如果eax初值非0, 则执行上面的代码后,结果为0.

//还有这段代码……

mov eax,dword ptr [ebp-08]

把堆栈中里面偏移地址ebp-08的dword给eax

 

***               今天  笔记           ***

push:把一个32位的操作数压入堆栈,同时esp(栈顶)减4

pop:相反,esp被加4,一个数据出栈

sub:减法。第一个参数是被减数所在的寄存器,第二个参数是减数

add:加法。第一个参数是被减数所在的寄存器,第二个参数是减数

ret:返回。相当于跳转回调用函数的地方,对应Call指令来调用一个函数,返回到call

之后的下一条指令

call:调用函数,它会把它的下一条指令的地址压入堆栈中

 

数据传送指令

mov:数据移动。第一个参数是目的,第二个参数是来源。

xor:异或。常用xor eax,eax(清零操作)代替mov eax,0

lea:取得地址(取得第二个参数的地址到前面的寄存器中)

    lea edi,[ebp-0cch]

    等同于mov edi,ebp-0cch(不过这个是错误的写法)

    所以有时候可以用lea代替mov操作

 

stos:是串存储指令,它的功能是将eax中的数据放入edi所指向的地址中

      同时edi会增加4个字节

 

跳转与比较指令

jmp:无条件跳转。

jg:大于的时候跳转,通常前面有一条比较指令

jl:小于的时候跳转,通常前面有一条比较指令

jge:大于等于的时候跳转,通常前面有一条比较指令

cmp:比较,往往在jg,jl,jge条件跳转指令前面

 

堆栈与函数的关系

   堆栈反参数从函数的外部传入到函数的内部,

堆栈中划分区域来容纳函数的内部变量

 

函数调用约定:

指调用者和被函数间传递参数及返回参数的方法

windows上有Pascal方式WINAPI方式(_stdcall)C方式(_cdecl_)

 

 

for循环反汇编

mov <循环变量>,<初始值>;给循环变量赋初值

jmp B;跳到第一次循环

A:;修改循环变量

……

B: cmp<循环变量>,<限制变量>;修改循环变量

   jge 跳出循环

   (循环体)

    ……

   jmp A;跳回去修改循环变量

 

do 循环

cmp <循环变量>,<限制变量>

jl  <循环开始点>

 

 

while循环

A: cmp<循环变量>,<限制变量>

   jge B

   (循环体)

    ……

   jmp A

B: 循环结束了

 

原创粉丝点击