一、为什么学习汇编语言
中国人和中国人沟通需要学习汉语
中国人和美国人沟通在会汉语的基础上还要学习英语
那么,人和机器沟通的话需要学习哪些语言呢?
答案是:人类的语言+机器语言
但是,机器语言都是由0和1组成,人类非常难读懂,所以出现了一种便于人类理解的语言 - 汇编语言。汇编语言介于人类语言和机器语言之间,人类通过汇编语言编写代码,执行的时候会将汇编语言翻译成机器语言,操作机器执行命令。
二、进制的思想本质
A、常见的进制
2进制:二进一,计算机 0 1
8进制:八进一,由8个符号组成:0 1 2 3 4 5 6 7
10进制:十进一,由10个符号组成:0 1 2 3 4 5 6 7 8 9
16进制:十六进一,由16个符号组成:0 1 2 3 4 5 6 7 8 9 a b c d e f
B、进制的本质
进制的本质就是查数
三、进制的运算
本质就是移位
例如:2+3 :先找到 2,然后向右移3位之后的数就是结果。
2 * 3 :3个2或者2个3,从0开始数3个2之后的数字就是答案。
以8进制为例进行分析
A、8进制数字排列
0 1 2 3 4 5 6 7 10 11 12 13 14 15 16 17 20 21 22 23 24 25 26 27 30 31…
B、8进制计算以下结果
2+3 = 5 //解析:本质是2往后数3位。先找到2,往后数1位是3,再数1位是4,数1位是5,即答案是5
2 * 3 = 6 //解析:3个2或者2个3。从0开始,1个2是2(即0向后数两位),2个2是4,3个2是6
4+5 = 11 //计算方法参照2+3
4 * 5 = 24 //计算方法参照2*3
C、八进制乘法表
D、八进制加法表
四、二进制和十六进制的深层理解
略
五、数据宽度理解
A、字节的理解
字节(Byte)、千字节(KByte)、兆字节(MByte)、GByte
1KB= 1000Byte
1MB = 1000KB
1GB = 1000MB
B、深入理解
简单理解:1个字符也就是指一个文字,一个文字由两个字节组成;一个字节有8位,即 8bit位。例如:你好世界 一共四个字符,一个字符由两个字节组成,所以 2*4 = 8Byte,所以 你好世界 占用8Byte。
位、字节、字、双字 的关系:
六、有符号、无符号数规则理解
A、无符号数规则
你看到的数字是什么,那结果就是什么
1 0 0 1 1 0 1 0 十六进制:0X9A 十进制:154
B、有符号数规则
最高位是符号位:1(负数) 0(正数)
1 0 0 1 1 0 1 0 如何转换?
七 、原码反码补码
编码规则
有符号数的编码规则
原码:最高位符号位,对其他的位进行本身绝对值即可。
反码:
- 正数:反码和原码相同
- 负数:符号位一定是1,其余位对原码取反。
补码:
- 正数:补码和原码一样。
- 负数:符号位一定是1,其余位 反码+1
以8位的数字为例:
例:如果是正数,则原码、反码、补码都一样
1
#原码 0 0 0 0 0 0 0 1
#反码 0 0 0 0 0 0 0 1
#补码 0 0 0 0 0 0 0 1
------------------------------
例:如果是负数
-1
#原码 1 0 0 0 0 0 0 1
#反码 1 1 1 1 1 1 1 0
#补码 1 1 1 1 1 1 1 1
------------------------------
例:负数
-7
#原码 1 0 0 0 0 1 1 1
#反码 1 1 1 1 1 0 0 0
#补码 1 1 1 1 1 0 0 1
注:寄存器中的存储规则 ,如果是正数就直接存,如果是负数则存储其补码。
八、位运算
计算机现在可以存储所有的数字(整数、浮点数、字符)均是以0 1 存储。
A、与运算(and &)
计算规则:都是1则为1,否则为零。
1011 0001
1101 1000
-------------------与运算
1001 0000
B、或运算(or |)
对应位 只要有1结果就为1,同时是0则为0
1011 0001
1101 1000
----------------或运算
1111 1001
C、非运算(单目运算符 not ~)
0就是1,1就是0 ,取反!
1101 1000
---------------取反运算
0010 0111
D、异或运算(xor ^)
相同位 不一样的为1
1011 0001
1101 1000
-----------------异或运算
0110 1001
E、左移(shl <<)
所有二进制位全部左移若干位,高位就丢弃了,低位补0。
0000 0001
-----------------左移操作
0000 0010
F、右移(shr >>)
所有二进制位全部右移若干位,低位就丢弃了,高位需要补0、1(由符号位决定)。
0000 0001
---------------右移
0000 0000
G、十进制进行位移运算
例子:
int a = 10;
printf("%d\n",a>>2);//10右移2位,即10/4 = 2 (这里是整除)
H、位运算的加减乘除
计算机只认识0和1
加减乘除都是建立在”加“的基础上。
例子一:4+5 =? 计算机的计算规则
人类的计算方法:
按十进制方法算:
4+5 = 9
按二进制方法算:
0000 0100
0000 0101
-----------------加法运算
0000 1001
即:4+5 = 0000 0100+0000 0101 = 0000 1001 = 9
======================================================
计算机的计算原理:
#第一步:异或。如果不考虑进位,异或就可以直接出结果。
0000 0100
0000 0101
-----------------异或运算
0000 0001
#第二步:与运算。(判断进位,如果与运算结果为0则没有进位)
0000 0100
0000 0101
------------------与运算
0000 0100
#第三步:将与运算的结果左移一位。
0000 0100
---------------左移一位
0000 1000
#第四步:异或(将第一步和第三步结果异或)。
0000 0001
0000 1000
----------------异或操作
0000 1001
#第五步:与运算。(判断进位,如果与运算结果为0,没有进位)
0000 0001
0000 1000
-----------------与运算
0000 0000
#第六步:最终的计算结果就是第四步中异或的结果。
4+5 = 9
0000 0100 +0000 0101 = 0000 1001 = 9
例子二:4-5 =?
本质也是转成加法计算,即4+(-5)
注意点:
1、负数存储的是补码。
2、1111 1111 =FF 即可以认为是16 也可以认为是 -1 和符号位有关系。
例子三:x*y
本质是y个x相加,还是按加法进行运算。
例子四:x/y
本质是减法,就是x能减去多少个y
计算机只会做加法!
九、汇编学习环境及必要说明
A、环境配置
- Vc6
- OD
- 抓包工具 (fiddler)
- 加密解密工具
B、通用寄存器
- 32位的通用寄存器只有8个(EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI)
- 存值的范围 0 ~ FFFF FFFF
C、计算机如何向寄存器存值
1、mov指令
可以将数字写入寄存器,也可以将寄存器中的值写到寄存器。
- mov 存的地址 存的值
- mov 存的地址1 存的地址1
2、不同的寄存器
32位 16位 8位
EAX AX AL
ECX CX CL
EDX DX DL
EBX BX BL
ESP SP AH
EBP BP CH
ESI SI DH
EDI DI BH
8位:L低8位、H高8位
end