Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6269141
  • 博文数量: 2759
  • 博客积分: 1021
  • 博客等级: 中士
  • 技术积分: 4091
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-11 14:14
文章分类

全部博文(2759)

文章存档

2019年(1)

2017年(84)

2016年(196)

2015年(204)

2014年(636)

2013年(1176)

2012年(463)

分类: 网络与安全

2014-07-19 09:31:30

   了解了汇编语言的寄存器的基础知识,这次来把现在自己想到的、剩下的知识点一起总结梳理下吧!当然这么短的时间不可能学的会汇编编程了,不过自己的初衷原本就不是掌握汇编,而只是读懂汇编;读懂汇编才能逆向分析,仅此而已,如果说以后可以在C/C++中嵌入汇编代码提高程序效率之类的问题当是以后的事情了。好了,闲话少叙,今天就来把剩下的汇编知识点“一网打尽”吧!

一、[BX]和loop指令
   直接来解释下这两个指令吧!我们知道[0]可以表示偏移量为0的内存单元(段地址存在CS里),[BX}则提供了更为灵活的方式,即mov ax, [bx]的功能是寄存器bx中存放的数据作为一个便宜地址EA,段地址SA默认在ds中,将SA:EA处的数据送入ax中,即(ax)=((ds)*16+(bx)),()表示寄存器中的值。实际上,[]就表示一个内存单元,其中的数值或寄存器则表示了偏移量的来源。
   loop指令是循环指令,格式是loop 标号。当CPU执行loop命令时需要执行两步操作:1)(cx) = (cx)-1; 2) 判断cx中的值,不为零时则转至标号处执行循环体语句。比如程序:

点击(此处)折叠或打开

  1. assume cs:code
  2. code segment
  3.     mov ax, 2
  4.     mov cx, 11
  5. s: add ax, ax
  6.     loop s
  7.     mov ax, 4c00h
  8.     int 21h
  9. code ends
  10. end

二、and与or指令
   and指令即逻辑按位与操作,利用此操作可以将操作对象的相应位设为0,其他位不变:

点击(此处)折叠或打开

  1. mov al, 01100011B
  2. and al, 00111011B

  3. al = 00100011B  //执行后
    or指令即逻辑按位或操作,利用此操作可以将操作对象的相应位设为1,其他位不变:

点击(此处)折叠或打开

  1. mov al, 01100011B
  2. or al, 00111011B

  3. al = 01111011B
    除了[A-D]X的四个通用寄存器之外,还有与bx功能相近的两个寄存器:si与di,si与di不能够分成两个8位寄存器来使用,其余功能类似,比如:

点击(此处)折叠或打开

  1. mov bx, 0
  2. mov ax, [bx]

  3. mov si, 0
  4. mov ax, [si]

  5. mov di, 0
  6. mov ax, [di]
    下面的语句功能也是一样的:

点击(此处)折叠或打开

  1. mov bx, 0
  2. mov ax, [bx+123]

  3. mov si, 0
  4. mov ax, [si+123]

  5. mov di, 0
  6. mov ax, [di+123]

三、转移指令
   可以修改IP,或同时修改CS和IP的指令统称为转移指令。8086CPU的转移行为有两类:
-1. 只修改IP,称为段内转移,如:jmp ax;
-2. 同时修改CS和IP,称为段外转移,如:jmp 1000:0;
   至于call和ret指令,其实也是转移指令,从执行效果上看:
-1. CPU执行ret指令时,相当于进行:pop IP;
-2. CPU执行retf指令时,相当于进行:pop IP; pop CS;
   当CPU执行call指令时,进行两步操作:
-1* 将当前的IP或CS和IP一起压入栈中;
-2* 转移

PS:好了,汇编的基础暂时告一段落,但是资料还是放在案头,学习的过程中有不懂的随时来查阅补充了。



阅读(896) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~