标题:
[原创]
汇编基础一日一学习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