汇编基础-入门之路

​         初学汇编,本篇文章的内容主要包含一些基础的汇编知识以及个人的见解,难免会有出错的地方,望各位师傅多多包涵。

一、进制和进制运算

​ 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 的路径指向对应名称的目录中。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值