鱼C论坛

 找回密码
 立即注册
查看: 3347|回复: 7

[技术交流] 1.2 简要复习常用的汇编指令

[复制链接]
发表于 2011-11-13 18:56:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1.2.1 堆栈相关指令
  对于指令的详细了解,应该查阅Intel发布的指令手册。但是从头开始阅读那些手册是一件令人望而生畏的事情。读者暂时可以只初步了解,忽略一些细节,当实际用到的时候,再具体查阅相关指令。
  ·push:把一个32位的操作数压入堆栈中。这个操作导致esp被减4Esp被形象地成为栈顶。我们认为顶部是地址小的区域,那么,压入堆栈的数据越多,这个堆栈也就越堆越高,esp也就越来越小。在32位平台上,esp每次减少4字节。
  ·pop:相反,esp被加4,一个数据出栈。Pop的参数一般是一个寄存器,栈顶的数据被弹出到这个寄存器中。
   一般不会把subadd这样的算术指令,以及callret这样的跳转指令归入堆栈相关指令中。但是实际上在函数参数传递过程中,subadd是最常用来操作堆栈;callret对堆栈也有影响。所以这里做特殊处理。
  ·sub:减法。第一个参数是被减数所在的寄存器;第二个参数是减数。(对应的还有add指令。)
  ·add:加法。
  ·ret:返回。相当于跳转回调用函数的地方。(对应的call指令来调用函数,返回到call之后的下一条指令。)
  ·call:调用函数。
  说道这里,有必要详述一些指令对堆栈的影响。某些指令会“自动”地操作堆栈,这就是calljmp的不同之处。Call指令会把它的下一条指令的地址压入堆栈中,然后跳转到它调用的函数的开头处;而单纯的jmp是不会这样做的。同时,ret会自动地弹出返回地址。
   (小提示:call的本质相当于push+jmpret的本质相当于pop+jmp
  不但pushpopcallret会操作堆栈,subadd也可以用于操作堆栈。如果我们要一次在堆栈中分配44字节长整型空间,那么没有必要4次调用push,很简单地把esp减去4*4=16即可。当然,也可以同样地用add指令来恢复它。这常常用于分配函数局部变量空间,因为C语言函数的局部变量保存在堆栈里。
1.2.2  数据传送指令
  ·mov:数据移动。第一个参数是目的,第二个参数是来源。在C语言中相当于赋值号。这是最广为人知的指令。
  ·xor:异或。这虽是逻辑运算指令,但是有趣的是,xor eaxeax这样的操作常常用来代替mov eax0。好处是速度更快,占用字节数更少。
  ·lea:取地址(第二个参数)后放入到前面的寄存器(第一个参数)中。
  (小提示:见到xor eaxeax,应该马上明白这是清零操作。)
  但是实际上,有时候用lea用来做和mov同样的事情,比如赋值。看下面一条指令:
  lea dei,[ebp-0cch]
  方括弧表示存储器,也就是ebp-0cch这个地址所指向的存储内容。但是lea要求取[ebp-0cch]的地址,那么地址就是ebp-0cch,这个地址将被放入到edi中。换句话说,这等同于:
  mov dei,ebp-0cch
  但是以上mov指令是错误的,因为mov不支持后一个操作数写成寄存器减去数字。但是lea支持,所以可以用lea来代替它。
  指令的操作数能采用的运算符号有非常复杂的限制。如果需要使用,应该查询指令手册。
  为了讲解stos,下面解说前面提到的代码:
  mov  ecx,30h
  mov   eax,0cccccccch
  rep    stos dword ptr es:[edi]
Stos是串存储指令,它的功能是将eax中的数据放入edi所指的地址中,同时,edi会增加4(字节数)。Rep使指令重复执行ecx中填写的次数。方括弧表示存储器,这个地址实际上就是edi的内容所指向的地址。这里的stos其实是对应的stosd,其他还有stosbstosw,分别对应于处理412个字节,这里对堆栈中30h*40c0h)个字节初始化为0cch(也就是int3指令的机器码),这样发生意外时执行堆栈里面的内容会引发调试中断。
1.2.3 跳转与比较指令
  部分跳转指令如下:
  ·jmp:无条件跳转。这也是多年后我依然未忘记的少量指令之一。
  ·jg:顾名思义,大于的时候跳转。通常前面有一条比较指令。
  ·jl:顾名思义,小于的时候跳转。通常前面有一条比较指令。
  ·jge:顾名思义,大于等于的时候跳转。通常前面有一条比较指令。
  类似的指令还有一些,这里就不介绍了。
  下面介绍一条比较指令。
  ·cmp:顾名思义,比较。往往是jgjljge之类的条件跳转指令的执行条件。


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-11-13 20:30:41 | 显示全部楼层
学了就忘了, 的却要经常看看汇编了!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-11-13 20:32:54 | 显示全部楼层
想问一下
这是你自己写的还是在什么书上看到的啊!!
如果在书上看到的,能不能把这书介绍一下给我啊!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-11-13 21:52:02 | 显示全部楼层
如果在书上看到的,能不能把这书介绍一下给我啊!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-11-13 22:29:36 | 显示全部楼层

天书夜读-从汇编语言到Windows内核编程
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-11-14 00:02:51 | 显示全部楼层
不错,复习了一下。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-11-14 15:42:41 | 显示全部楼层
复习一下。~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-11-14 18:24:37 | 显示全部楼层
憔悴心只为你 发表于 2011-11-13 22:29
天书夜读-从汇编语言到Windows内核编程


知道了,我也去看看!!谢谢啊!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-19 10:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表