Board logo

标题: [原创] 汇编基础一日一学习8 [打印本页]

作者: 柔肠寸断    时间: 2009-5-24 01:30     标题: 汇编基础一日一学习8

  大家好。今天我们来讲解下“标志位”。  因为无论何时,当程序执行算术运算时都有可能发生因溢出而导致的错误。。 高级语言并不侦测溢出错误。。 这导致我们往往很难发现BUG。 于此相反,在汇编语言中由于执行每步操作后,检查cpu的状态值。因为可以很好的控制溢出错误。。。
     所以从以上我们得到结论: “标志位”标示的是我们的cpu的状态值。。。
   

   今天我们讲解的是算术运算的影响的标志,例如ADD SUB INC DEC指令影响的标志。


    那么ADD SUB  INC DEC指令我在这里大致的介绍下。。

   1.ADD 指令将同尺寸的源操作数和目的操作数相相加结果返回给目的操作数。举个例子

    ADD EAX, EBX   那么就等于 EAX  =  EAX + EBX
   
   2.SUB指令将源操作数从目的操作数中减掉,结果同样返回目的操作数。 举个例子

    SUB EAX, EBX    那么就等于 EAX = EAX - EBX

   3.INC DEC指令是将 从操作数中加一或者减1,它只有一个操作数

    例如 INC EAX = EAX + 1        DEC EAX  = EAX - 1


标志位:

1.    首先讲解下“零标志”和 “符号标志”。“零标志” 它的标志位标示是“ZF”,它一般是当算术运算指令的目的操作数被赋以零值的时候,零标志就被相应的设置。。 它是非常有用的,因为很多的跳转指令是检查零标志位,从而进行跳转的。。

     举个例子:
     mov ecx, 1h
     sub ecx, 1h   
   注意此时目的操作数变为0了,那么相应的零标志位就被赋值。此时ZF = 1。 在之前我已经说过 计算机内存是以二进制形式存储数据的,二进制的基数是2.它能标示的也就是"0", "1"
。一般我们把0标示布尔类型的fasle   1标示布尔类型的true 。 因为我们大千世界,往往要发生很多不可预料的事情。那么就需要做出判断。此时假设我们的计算机只有1来标示,那么它就是畅通无阻的,根本就不能判断了。

      

    说了这么多,到底是想表达什么呢。 我只是想说在计算中内存中我们的数据只有两种标示状态1 和 0 。 那么ZF置于1,标示此时操作数结果“的确(真)”是0。  如果ZF置于0,因为0标示false,那么就标示操作数结果“不是(假)”0 。

    在举个例子
    mov eax, 2h
    sub eax, 1h
    此时目的操作数结果eax = 1h ,所以此时ZF标志位 = 0  。 表示目的结果不是0。


    但是我们举的例子都是无符号整数,那么有符号整数是如何影响标志位的呢。。因为有时候需要判断我们的运算结果 目的操作数 到底是否是负数。 因为负数代表的就是有符号了。例如eax = -1h  "-"就是负数的符号标示。 那么我们的符号标志位 是“SF”,如果我们的目的操作数的结果是有符号值的话,那么SF = 1  。

   举例
   mov  eax, -2h
   sub  eax, 1h
   此时因为我们的目的操作数eax寄存器的结果是有符号数值,所以此时SF = 1,标示“的确(真)” 是有符号。呵呵这样理解大家好理解。。
   
  相应的   
   
   mov  eax, -2h
   add  eax, 2h
   此时因为eax寄存器的值是无符号的。所以此时SF =0, 嘿,注意没。eax 结果是0的。所以此时ZF = 1
     



2.接下来讲解“进位标志”。
进位标志一般用于(无符号算术运算) 。

“ 只有当cpu执行无符号算术运算的时候,进位标志才有意义”。 如果无符号加法运算结果对目的操作数而言太大(或者太小)而无法容纳时候,进位标志将被设置。。举例

   MOV AX,9FFF
   ADD AX,9FFF
   此时因为ax = 9FFF+9FFF = 13FFE, 因为ax寄存器是eax寄存器的低16位寄存器,所以只能容纳2个字节也就是只能“3FFE”,那么此时最高位的1将抛弃,此时我们的进位标志CF = 1, 表示“的确(真)进位”。

   例如
   mov ax, 0030h
   add ax, 3333h
   此时ax = 3363h,此时目的操作数结果是2个字节,所以并美誉发生进位操作。此时CF就表示0 。



总结: 这些标志位只有两个状态那就是 "0"->假    "1" -> 真。  例如ZF = 1 ,标示运算结果“真”的为0。 ZF为0 标示运算结果不为0。

这些标志位,大家不用刻意的去记。等用的多了自然就记住了。 不过你如果想记。那么你可以这样。。 例如 ZF = Zero Flags 零标志
SF = Sign Flags 符号标志  这样记得时候就好多了。直接把相应的单词拼写出来,然后写的时候值用各个单词的首字母即可。。 好今天的课程就讲这么多。下节课我们来讲解其他的标志位,以及一些跳转指令所依据的标志位的状态(也是非常重要的,因为在做免杀遇到一些分之语句,有时我们需要通过标志位来判断该怎么修改)

——下面留个小作业。。。



小作业:

1.
  mov   eax, 00305040h
  add   eax, 00303033h
  sub   eax, 00608073h

问: 执行完以上指令后,把今天学到的这3个标志位的值给一一写出来。。

   
2.
  mov   ax, 7FFFh
  mov   ax, 8FFFh
   
问: 执行完以上指令后,把今天学到的这3个标志位的值给一一写出来。。


3. mov  eax, -1h
   add  eax, 2h
问: 执行完以上指令后,把今天学到的这3个标志位的值给一一写出来。。

作者: EndTo偌枫    时间: 2009-5-27 10:04

学习阿Y荡阿.em66.
作者: plantseth    时间: 2009-5-29 19:51

1.ZF=1 SF=0 CF=0
2.ZF=0 SF=0 CF=1
3.ZF=0 SF=0 CF=0
作者: 自在飞花    时间: 2009-6-3 21:16

1.  mov   eax, 00305040h
      add   eax, 00303033h
       sub   eax, 00608073h
问: 执行完以上指令后,把今天学到的这3个标志位的值给一一写出来。。
“零标志” 它的标志位标示是“ZF”1
符号标志位 是“SF”0
进位标志CF0
2.  mov   ax, 7FFFh
  mov   ax, 8FFFh
问: 执行完以上指令后,把今天学到的这3个标志位的值给一一写出来。。
ZF=0  SF=0  CF=0
3. mov  eax, -1h
   add  eax, 2h
问: 执行完以上指令后,把今天学到的这3个标志位的值给一一写出来。。
ZF=0   SF=0    CF=1
作者: hkhs615    时间: 2009-12-17 16:20

学习.................
作者: kisaly    时间: 2011-8-2 17:22

mov  eax, -1h
   add  eax, 2h
这个CF=1??我怎么觉得是0




欢迎光临 【3.A.S.T】网络安全爱好者 (http://3ast.com/) Powered by Discuz! 7.2