初学汇编,本篇文章的内容主要包含一些基础的汇编知识以及个人的见解,难免会有出错的地方,望各位师傅多多包涵。
一、进制和进制运算
1. 每一种进制都是完美的,想要学好进制首先要忘掉十进制,也要忘掉进制之间的转化。
2. 进制的定义:
(1)八进制:由八个符号组成,分别是 01234567,逢八进一。
(2)十进制:由十个符号组成,分别是 0123456789,逢十进一。
(3)N 进制:由 N 个符号组成,逢 N 进一。
3. 进制的运算
进制的运算的本质就是查数。
十进制运算用十进制运算表,那八进制就用八进制的运算表。
每一种进制自身都是一个完整的体系,可以直接做各种运算。
二、二进制简写形式
1. 计算机为什么要使用二进制
(1)计算机是需要用电的,电路只有两种状态:
1 真(通电)
0 假(未通电)
计算机中存储的任何文件,接收的任何指令,都是由 0 和 1 组成的。
(2)16 进制在计算机中可以看成二进制的简写形式
二进制与十六进制的映射:
二进制 十六进制
1 : 0001 0x01 (1)
2: 0010 0x02 (2)
3: 0011 0x03 (3)
4: 0100 0x04 (4)
5: 0101 0x05 (5)
6: 0110 0x06 (6)
7: 0111 0x07 (7)
8: 1000 0x08 (8)
9: 1001 0x09 (9)
10: 1010 0x0A (A)
11: 1011 0x0B (B)
12: 1100 0x0C (C)
13: 1101 0x0D (D)
14: 1110 0x0E (E)
15: 1111 0x0F (F)
这些转换是需要记住的,对以后的学习会有很大的帮助
三、数据宽度
数学上的数字,是没有大小限制的,可以无限的大。但在计算机中,由于受硬件的限制,数据都是有长度限制的,我们称之为数据宽度,超过最多宽度的数据会被丢掉。
在计算机中常见的数据宽度:
首先就是位(bit),然后是字节(byte),1 字节 = 8 位,再者就是字(word),1 字 = 16 位,双字 (Doubleword)=32 位。
存储范围
在计算机中,每个位能存一个 0 或 1,另外,在二进制中四位 1 等于十六进制中的一个 F,那么我们就能根据这些能够知道每个宽度所能存储的范围,
字节:0~0xFF
字:0~0xFFFF
双字:0~0xFFFFFFFF
四、有符号数和无符号数
在计算机中,所有东西都是用二进制的 0 和 1 来进行存储的,比如说一个逗号、一个程序、一个有符号数,一个无符号数等等,都是用 0 和 1 进行存储的。所以在进行编码的时候,会按照相应的编码规则进行编码,有符号数按有符号数的编码规则,无符号数按无符号数的编码规则,所以说给你一串数字:1 0 0 1 1 1 0 1 0,告诉你他是个文本,那么他可能就代表 0 一个逗号。不谈这个文本,如果它是一个无符号数,我们就需要按照无符号数的编码规则去进行编码,既然是无符号,顾名思义,可以直接转换成十六进制数,或者是十进制数,转换成 16 进制就是 0x9A 十进制就是 154。
但如果是有符号数的话,因为是有正数和负数之分的,所以编码规则相对不同,即正数和负数的编码不同。
有符号数,拿上面的一串数字来说:0 0 0 1 1 0 1 0,最高位是 1,这个数就是负数,最高数是 0,这个数就是正数,那么很显然这个是正数。至于有、无符号数是怎么进行编码的,就需要了解到原码、补码和反码了。
五、原码、补码和反码
1. 编码规则
首先在计算机中,靠二进制数 0 和 1 存储信息,例如 0 1 0 1 0 1 0 1,不同的文件有着不同的编码规则,也就是说这些 0 和 1 按照编码规则,解析成文本,视频,音乐等等。
2. 原码、反码和补码
原码:最高位为符号位,其余各位为数值本身的绝对值
反码:
正数:反码与原码相同
负数:符号位为 1,其余位对原码取反
补码:
正数:补码与原码相同
负数:符号位为 1,其余位对原码取反加 1
了解到原码、反码和补码之后,我们也就能够轻松地理解有、无符号数是怎样进行编码的了。
六、计算机做的运算
1. 与运算(and&)
两个位都为 1 时,结果才为 1
2. 或运算(or|)
只要有一个为 1 就是 1
3. 异或运算(xor^)
不一样的时候是 1
4. 非运算(not~)
0 就是 1 1 就是 0
5. 移位运算
左移(shl <<)
各二进位全部左移若干位,高位丢弃,低位补 0
eg:1101 1000 左移 2 位为:0110 0000
右移(shr sar >>)
各二进位全部右移若干位,低位丢弃,高位补 0 或者补符号位
注:右移是分两种情况的,就是高位补 0 和补符号位
shr 1101 0101 右移 0011 0101
对应 C 语言(>>)
unsigned int a= 10;
printf("%d\n",a>>2);
sar 1101 0101 右移 1111 0101
对应 C 语言(>>)
int a=10;
printf("%d\n",a>>2):
C 语言中,有符号的右移是补符号位,无符号位的右移是补 0。上述字母代表的是汇编中对应的指令,符号代表的是 C 语言中对应的指令。所以说计算机做的所有运算归根到底都是位运算。
七、位运算加减乘除(用位运算来实现四则运算)
不考虑进位的情况下,异或的结果和加结果一样。所以计算机在进行加法的时候的大致过程是这样的:
举个例子:4+5=?
(1)首先,两个二进制数进行异或
0000 0100
0000 0101 异或
————————
0000 0001
(2)其次,两个数进行与运算
0000 0100
0000 0101 与
————————
0000 0100
(3)因为与运算是计算机能够判断在进行加法时是否发生了进位的运算,所如果发生了进位,那么就会再次进行异或运算,如果没有进位,第一次进行的异或运算的结果就是真实的结果,以下是发生了进位之后的异或运算
0000 0001 —> 第一次异或的结果
0000 1000 异或 —> 上次与运算的结果左移一位之后
————————
0000 1001
(4)再次进行与运算,判断上次异或是否发生进位,没有进位,直接出结果,进位了,继续进行异或运算
0000 0001
0000 1000 与
————————
0000 0000
注:(1)与运算结果有 1 的地方就是发生了进位,如果没有发生进位,那么结果就应该全部为 0
(2)第二次异或之所以要加左移一位的结果是因为与运算结果为 1 的地方本应该是要进一位的
其他运算的运算过程
4-5=4+(-5)
减法就是加法,所以运算的过程和加法基本是一致的,至于乘法,乘法就是加法,x*y 的本质就是 x 个 y 相加,除法的本质就是减法,X/Y 其实就是 X 能减去多少个 Y。归根结底,四则运算就是加法的运算,用计算机的位运算进行运算,本质都是一样的。
所以说计算机可以通过位运算来进行最基本的四则运算,那么也就可以以此进行一些更复杂的运算。
八、汇编环境搭建
汇编环境搭建
1. 学汇编不是为了写代码
学汇编对学习应用开发和安全相关方面都有帮助
2. 环境配置
下载 DTDebug,在滴水官网下载,下载完成之后进行简单配置,在 options—>Appearance—>Directories 中,将 UDD 和 Plugin 的路径指向对应名称的目录中。