几个汇编指令解析

1. call 子程序偏移量

注解:子程序偏移量是指,call指令即将跳转至的子程序的地址(子程序的第一个字节)减去 call 指令读取后 CS:IP指向的指令(即,call 指令的下一指令的地址)


2. STOS (STOre into String) 存入串指令

  STOS DST

  STOSB //存放字节串 ( DI ) = AL

  STOSW //存放字串 ( DI ) = AX

  执行操作:把AL或AX中的内容存放由DI指定的附加段的字节或字单元中,并根据DF值修改及数据类型修改DI的内容.

  a.在执行该指令之前,必须把要存入的数据预先存入AX或AL中,必须预置DI的初值.

  b.DI所指向的存储单元只能在附加段中,即必须是ES:[DI]

 3. LODS ( LOaD from String ) 从串取指令

  LODS SRC

  LODSB //从字节串取 AL=(SI)

  LODSW //从字串取 AX= (SI±1) (SI)

  执行操作:把由SI指定的数据段中字节或字单元的内容送入AL或AX中,并根据DF值及数据类型修改SI的内容.

  a.在执行该指令之前,要取的数据必须在存储器中预先定义(用DB或DW),必须预置SI的初值.

  b.源串允许使用段超越前缀来改变数据存储的段区.


4 ret , retn, retf

retn表示return near,与之对应的是retf;n没有恢复段的过程,retf有个除了pop ip以外还会pop cs;

不管是retn还是rentf,后面带的数字是在执行完ret指令以后sp增加的字节数,默认ret相当于ret 0

retn 4相当于pop ip,add sp, 4(esp相当于移动了8个字节)也就是在返回的同时释放了参数使用的栈空间,windows api中常见的stdcall就是这种调用形式,所以省去了函数调用外的一条add指令


5 jecxz和jecz

根据 CX、ECX 寄存器的值跳转: JCXZ(CX 为 0 则跳转)、JECXZ(ECX 为 0 则跳转);


6 cld和std

清除方向标志,在字符串的比较,赋值,读取等一系列和rep连用的操作中,di或si是可以自动增减的而不需要人来加减它的值,cld即告诉程序si,di向前移动,std指令为设置方向,告诉程序si,di向后移动

posted on 2011-08-15 01:10  rainduck  阅读(624)  评论(0编辑  收藏  举报

导航