汇编的一些基础知识收集。
程序代码:
在学习加密与解密第三版了,基础很重要特别那些加减乘除,之前看王爽的书时我一直都是避开。 收集中。 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 编辑 ]