ollydbg汇编常用知识(二)

以下知识是常用知识,但不易记牢,不易理解,特记录如下以便日后查询

常见编码

范围

ASCII、GBK、ANSI、Unicode、UFT-8

相互关系:

ASCII

8位,即一个字节,最大支持256种不同字符,包含所有大小写字符和数字和其他特殊字符

GBK

中国的编码,前127位于ASCII一致,后面用两个字节,即16位表示一个汉字,国内开发比较常见,虽然我还没有接触过

ANSI

一种对自己定义的编码的叫法,不同环境下代表的编码不同

Unicode

通常2字节或4字节
又名统一码于万国码,将所有文字符号统统归于两个字节。不再累述
很多编码都有Unicode编码版本

UTF-8编码规则

8位英文的与ASCII相同
对于n字节的符号,第一个字节的前n位都为1,第n+1位为0,后面其他字节的前两位全部为10。剩下的所有位都是符号的Unicode码。

取模运算

整体分为两大步骤

1、cdq
这个指令把EAX的最高位,即31位,填充EDX的所有位,并扩展原来EDX为高位,EAX为低位,组合为一个64位的存储方式,即[edx][eax]
2.idiv
有符号除法,商存储在eax,余数存储在edx

移位运算

逻辑移位

【shl】
逻辑左移:高位移出,低位补0
比如3逻辑左移2位,3的二进制:
0000 0000 0000 0000 0000 0000 0000 0011
逻辑左移是把左边的高位移出两个(抛弃)0,然后整体左移两位,低两位空缺出来的补上两个0:
0000 0000 0000 0000 0000 0000 0000 1100
转化过后为12
【shr】
逻辑右移:高位补0,低位移出
比如11右移2位,11的二进制形式为:
0000 0000 0000 0000 0000 0000 0000 1011
11的二进制形式为:0000 0000 0000 0000 0000 0000 0000 1011,然后把低位的最后两个数字移出,因为该数字是正数,所以在高位补零。则得到的最终结果是
0000 0000 0000 0000 0000 0000 0000 0010
转换为十进制是2。
【溢出】
如果高位移出的是1,则左移发生溢出

算术移位

【sal】
算术左移:高位移出,低位补0,与逻辑左移等效,等效于2的n次方
【sar】
算术右移:高位补符号,低位移出,等效于2的-n次方
【溢出】
如果溢出的高位不等于新的符号位,则左移溢出

优化除法

1、除数是2的n次方的常量

无符号数优化为逻辑右移
有符号数优化为算术右移
例:a/8优化为a>>3,2的3次方为8

2、除数为非2次方的常量,记为c

a/c优化为a*m>>n,关系如下

n的值:32位寄存器33起步,16位寄存器17起步
m=2^n/c,正数向上取整,负数则向下取整

注:非2次方常量除法优化触发条件与编译器有关,比如debug就不会如此优化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值