Board logo

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

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

大家好,今天我们来学习下其他的几个标志。“PF标志位”“OF标志”, 其他还有一些标志位,但是我们并不常用。所以这里就不讲解了,等以后如果课程中需要的话,在讲解。如果有兴趣的可以去Intel官方下个Intel开发手册,自己看看。。上节课程学的3个标志位不知大家是否还记得。 它们分别是ZF SF  CF,如果你读不出来这3个标志位分别是什么,那么就请赶快的看下上节课的内容吧。

  1.首先介绍第一个PF标志位,它叫做奇偶标志位。它表示的结果所有的二进制位中1的个数如果是偶数则PF标志位是"真" 也就是= 1, 如果是奇数,PF = 0,也就是假。
   
  举个例子。例如
  mov eax, 10h
  add eax, 3h

  我们可以分析,加入我们之前的eax寄存器= 0h 那么传送过来10h 并且+3h以后 = 00000013h,那么此时我们看下13的二进制位(其实一些数据大家看运算结果也可以猜到结果是多少,但是最好去自己换算成二进制看下)就可以知道我们的运算结果是奇数还是偶数。13h二进制位是10011,由于二进制位中1的个数是3为奇数,所以PF = 0

  mov eax, 10h
  add eax, 4h

  同上,因为14h的二进制位是10100,因为1的个数为偶数,所以PF = 1。



  2.接下来介绍第2个标志位,OF标志位。 它叫做溢出标志位。 如结果超出了机器所能表示的范围称为溢出。
注意:这里的溢出和我们的缓冲区溢出可不一样。
  我们这里所说的有符号证数的运算产生的溢出。。并且仅仅是运算结果超出了机器所能表达范围的溢出。

  那么无符号数和有符号数到底是怎么转换的呢?因为我们汇编大多都是以16进制的表示形式,所以这里我就也以16进制的转换来说。

  因为我们一般负整数是以补码的形式存放在计算机内存的。 简单的讲,我们整数的补码就是相反数。因为计算机内存中只能存放二进制数值,取反也就是1->0  0->1.

  先举个简单的二进制数值1的例子。假设此时二进制数值00000001,那么它的补码就是11111111,那么此时它也就是二进制数的-1。同理,求11111111的补码则是00000001.

十六进制的补码计算。计算十六进制的补码可以将所有的数据位取反后+1。16进制求反最简单的一个方法就是将对应的数字位用15减除。
   
举个例子。
  十进制100  = 十六进制 64  ------->取反 9B+1 = 9C   ;9c则为16进制64的补码也就是十六进制-64。
  不信你可以试试,因为9c是一个字节。那么你通过给eax寄存器的低8位传送数据



自己也可以去测试,可以选择任意一款调试器或者是汇编编译器自己去测试,或者调试器也行,自己随便拉一个软件,然后填充一部分,设置下EIP,然后执行自己观察寄存器的窗口的变化。

而且注意看十六进制64  和它的负数。因为80386的地址线是32位,因为我们无符号数值在内存存储都是2的幂此方。所以我们无符号整数最大表示范围为0--------2的32次方-1 。但是有符号整数就不行了。

因为有符号整数可以表示整数也可以表示负数,具体是最高二进制位如果是1表示负数,如果是0表示正数。所以它既可以包含正数又可以包含负数,所以它的最大有效范围是 -(2的32次方/2)  ------- (2的32次方/2-1) 。

  讲完了负数的存储形式,我们来讲解溢出标志。
   

  因为溢出标志在进行又符号数运算的时候,如结果超过了及其所能表示的范围称为溢出。。

  举个例子。
  如 上面的
  xor eax, eax
  mov al, 9Ch
  add al, 9Ch
  因为结果大于了有符号数值所能表示的最大范围。因为9c是一个字节也就是8位。那么它的有效位是

  -(2的8次方/2) -----  (2的8次方/2)-1
  也就是-128  -----  127

而9ch+9ch显然大于,所以此时OF = 1 ,呵呵,但是别忘记这里还是发生了进位的。 所以此时CF = 1,如果不知道自己算下。。


今天的课程就这么多。。 希望大家都能消化了。 尤其是补码方面的知识以及怎么转换,大家要掌握了,以后在调试的时候用的到。


小作业:
  (1)
    xor eax, eax
    mov eax, 30h
    add eax, 8h
   此时PF标志位=?

  (2)
   求十六进制3C的补码。(提示各位取反后+1,16进制取反是用15减除各个位)

  (3)
   xor eax, eax
   add eax, 3c         
   add eax, 3c
   此时OF标志位=?

作者: EndTo偌枫    时间: 2009-5-29 08:36

学习了 谢谢LZ 辛苦了
作者: 自在飞花    时间: 2009-6-3 22:38

(1)
    xor eax, eax
    mov eax, 30h
    add eax, 8h
   此时PF标志位=?
38h=111000b   PF=0
  (2)
   求十六进制3C的补码。(提示各位取反后+1,16进制取反是用15减除各个位)
3cH=0011 1100   取反加上   11000100b = c4h
  (3)
   xor eax, eax
   add eax, 3c         
   add eax, 3c
   此时OF标志位=?
0
作者: hkhs615    时间: 2009-12-17 16:20

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

XOR 是什么意思呢?




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