![]() |
#2
lixingjiang2009-11-02 21:22
|

在学习加密与解密第三版了,基础很重要特别那些加减乘除,之前看王爽的书时我一直都是避开。
收集中。
and a,b a与b按位相与
规则:只有两个都是1时结果才为1,其它为0
例子:
mov al,01000000b
and al,01001000b
al=01000000b 即只有两个位都为1时结果才为1
--------------------勿在浮沙筑高台--------------------
or a,b a与b按位相或
规则:只有两个都是0时结果才为0,其它为1
例子:
mov al,01000000b
and al,01001000b
al=01001000b
--------------------勿在浮沙筑高台--------------------
not a 按位取反
规则:1变0,0变1
mov al,01000000b
not al
al=10111111b
--------------------勿在浮沙筑高台--------------------
xor a,b 按位异或
规则:只有同时为1或者同时为0时才为0,其它为1 [这个搜了N久才知道,汗]
mov al,01000000b
mov bl,01111001b
xor al,bl
al=00111001b
--------------------勿在浮沙筑高台--------------------
15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
of df if tf sf zf af pf cf
CF——进位标志 无符号数运算
PF——奇偶标志 1的个数为偶则pf为1 为奇数则pf为0
AF——辅助标志
ZF——零标志 结果为0时zf为1 不为0时zf为0
SF——符号标志
DF——方向标志 是控制标志位为方向标志,在串处理指令中控制处理信息的方向用。当DF为1时,每次操作后使变址寄存器SI和DI减小,这样就使串处理从高地址向低地址方向处理。当DF为0时相反
OF——溢出标志
TF—— 单步标志 当TF被置为1时,CPU进入单步执行方式,即每执行一条指令,产生一个单步中断请求。这种方式主要用于程序的调试。有符号数运算
IF——中断标志
LAHF 标志寄存器传送,把标志装入AH.
SAHF 标志寄存器传送,把AH内容装入标志寄存器.
PUSHF 标志入栈
POPF 标志出栈
PUSHD 32位标志入栈
POPD 32位标志出栈
--------------------勿在浮沙筑高台--------------------
test a,b 按位相与,但不改变目的操作数。 注:test 目的操作数,源操作数 其它与and一样
只改变标志位
cmp a,b 目的-源,不改变操作数,改变标志位
这里待续。。。
--------------------勿在浮沙筑高台--------------------
计算机的数据全都是以补码存储
正数补码:与原码相同
+2的补码是00000010b
负数补码:符号位为1,其余位为该数绝对值的原码按位取反,然后加1。
-2的补码是:
表示有符号数时,最高位是符号位,因为是负数,所以最高位是为1 [1表示负]所以10000010b
其余7位是-2的绝对值2的原码, 0000010b按位取反得1111101再把这个数加上1得到1111110
再加上最高位的符号位11111110 这个就是-2的补码了。
(1)如果补码的符号位为“0”,表示是一个正数,所以补码就是该数的原码。
(2)如果补码的符号位为“1”,表示是一个负数,求原码的操作可以是:符号位为1,其余各位取反,然后再整个数加1。
例如,已知一个补码为11111001,则原码是10000111(-7):因为符号位为“1”,表示是一个负数,所以该位不变,仍为“1”;其余7位1111001取反后为0000110;再加1,所以是10000111。
--------------------勿在浮沙筑高台--------------------
溢出标志是针对有符号数操作数才会使OF置位
处理器内部以补码表示有符号数,8个二进制位能够表达的整数范围是:+127 ~ -128,16位表达的范围是:+32767 ~ -32768.如果运算结果超出了这个范围,就是产生了溢出,有溢出,说明有符号数的运算结果不正确
例如:
mov al,60h
add al,70h ;al=D0 但是al是八字节,若是表示有符号时:+127 ~ -128
这时已超过这个范围,此时OF为1 表示溢出
溢出标志OF和进位标志CF是两个意义不同的标志.进位标志表示无符号数运算结果是否超出范围,运算结果仍然正确;溢出标志表示有符号数运算结果是否超出范围,运算结果已经不正确。
例1:3AH + 7CH=B6H
无符号数运算:58+124=182,范围内,无进位
有符号数运算: 58+124=182 ,范围外,有溢出
例2:AAH + 7CH=(1)26H
无符号数运算:170+124=294,范围外,有进位
有符号数运算:-86+124=28 ,范围内,无溢出
处理器对两个操作数进行运算时,按照无符号数求得结果,并相应设置进位标志CF;同时,根据是否超出有符号数的范围设置溢出标志OF。
应该利用哪个标志,则由程序员来决定。也就是说,如果将参加运算的操作数认为是无符号数,就应该关心进位;认为是有符号数,则要注意是否溢出。
判断运算结果是否溢出有一个简单的规则:只有当两个相同符号数相加,而运算结果的符号与原数据符号相反时,产生溢出;因为,此时的运算结果显然不正确。其他情况下,则不会产生溢出。
收集中。
and a,b a与b按位相与
规则:只有两个都是1时结果才为1,其它为0
例子:
mov al,01000000b
and al,01001000b
al=01000000b 即只有两个位都为1时结果才为1
--------------------勿在浮沙筑高台--------------------
or a,b a与b按位相或
规则:只有两个都是0时结果才为0,其它为1
例子:
mov al,01000000b
and al,01001000b
al=01001000b
--------------------勿在浮沙筑高台--------------------
not a 按位取反
规则:1变0,0变1
mov al,01000000b
not al
al=10111111b
--------------------勿在浮沙筑高台--------------------
xor a,b 按位异或
规则:只有同时为1或者同时为0时才为0,其它为1 [这个搜了N久才知道,汗]
mov al,01000000b
mov bl,01111001b
xor al,bl
al=00111001b
--------------------勿在浮沙筑高台--------------------
15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
of df if tf sf zf af pf cf
CF——进位标志 无符号数运算
PF——奇偶标志 1的个数为偶则pf为1 为奇数则pf为0
AF——辅助标志
ZF——零标志 结果为0时zf为1 不为0时zf为0
SF——符号标志
DF——方向标志 是控制标志位为方向标志,在串处理指令中控制处理信息的方向用。当DF为1时,每次操作后使变址寄存器SI和DI减小,这样就使串处理从高地址向低地址方向处理。当DF为0时相反
OF——溢出标志
TF—— 单步标志 当TF被置为1时,CPU进入单步执行方式,即每执行一条指令,产生一个单步中断请求。这种方式主要用于程序的调试。有符号数运算
IF——中断标志
LAHF 标志寄存器传送,把标志装入AH.
SAHF 标志寄存器传送,把AH内容装入标志寄存器.
PUSHF 标志入栈
POPF 标志出栈
PUSHD 32位标志入栈
POPD 32位标志出栈
--------------------勿在浮沙筑高台--------------------
test a,b 按位相与,但不改变目的操作数。 注:test 目的操作数,源操作数 其它与and一样
只改变标志位
cmp a,b 目的-源,不改变操作数,改变标志位
这里待续。。。
--------------------勿在浮沙筑高台--------------------
计算机的数据全都是以补码存储
正数补码:与原码相同
+2的补码是00000010b
负数补码:符号位为1,其余位为该数绝对值的原码按位取反,然后加1。
-2的补码是:
表示有符号数时,最高位是符号位,因为是负数,所以最高位是为1 [1表示负]所以10000010b
其余7位是-2的绝对值2的原码, 0000010b按位取反得1111101再把这个数加上1得到1111110
再加上最高位的符号位11111110 这个就是-2的补码了。
(1)如果补码的符号位为“0”,表示是一个正数,所以补码就是该数的原码。
(2)如果补码的符号位为“1”,表示是一个负数,求原码的操作可以是:符号位为1,其余各位取反,然后再整个数加1。
例如,已知一个补码为11111001,则原码是10000111(-7):因为符号位为“1”,表示是一个负数,所以该位不变,仍为“1”;其余7位1111001取反后为0000110;再加1,所以是10000111。
--------------------勿在浮沙筑高台--------------------
溢出标志是针对有符号数操作数才会使OF置位
处理器内部以补码表示有符号数,8个二进制位能够表达的整数范围是:+127 ~ -128,16位表达的范围是:+32767 ~ -32768.如果运算结果超出了这个范围,就是产生了溢出,有溢出,说明有符号数的运算结果不正确
例如:
mov al,60h
add al,70h ;al=D0 但是al是八字节,若是表示有符号时:+127 ~ -128
这时已超过这个范围,此时OF为1 表示溢出
溢出标志OF和进位标志CF是两个意义不同的标志.进位标志表示无符号数运算结果是否超出范围,运算结果仍然正确;溢出标志表示有符号数运算结果是否超出范围,运算结果已经不正确。
例1:3AH + 7CH=B6H
无符号数运算:58+124=182,范围内,无进位
有符号数运算: 58+124=182 ,范围外,有溢出
例2:AAH + 7CH=(1)26H
无符号数运算:170+124=294,范围外,有进位
有符号数运算:-86+124=28 ,范围内,无溢出
处理器对两个操作数进行运算时,按照无符号数求得结果,并相应设置进位标志CF;同时,根据是否超出有符号数的范围设置溢出标志OF。
应该利用哪个标志,则由程序员来决定。也就是说,如果将参加运算的操作数认为是无符号数,就应该关心进位;认为是有符号数,则要注意是否溢出。
判断运算结果是否溢出有一个简单的规则:只有当两个相同符号数相加,而运算结果的符号与原数据符号相反时,产生溢出;因为,此时的运算结果显然不正确。其他情况下,则不会产生溢出。
[ 本帖最后由 onepc 于 2009-11-3 07:50 编辑 ]