当前位置:   article > 正文

汇编语言 | 基础知识

汇编语言

文章目录

0x00 前言

0x01 为什么学习汇编语言

0x02 汇编语言的由来

0x03 机器语言和汇编语言

0x04 0和1构造万物

0x05 进制转换

0x06 进制运算

0x07 补码运算

0x07 解码和编码

0x08 参考文献

0x09 总结


0x00 前言

        汇编语言是计算机提供给用户的最快最有效的语言,也是能够利用计算机的所有硬件特性并能够直接控制硬件的唯一语言。但是由于编写和调试汇编语言程序要比高级语言复杂,因此目前其应用不如高级语言广泛。通过汇编语言的学习,可以具有在 CPU 的寄存器级上进行控制和操作的能力,获得直接对计算机硬件底层编程经验,从而对计算机系统有更深刻的认识。

        

        

0x01 为什么学习汇编语言

        首先我个人学习汇编语言主要是为了对二进制安全方面有一个更加深入的认识,通过掌握汇编指令完成对程序代码的调试工作。学会了汇编语言,不仅可以对计算机底层逻辑有更加深刻的理解,还可以在以后的工作中,从底层逻辑的角度更加深入的分析问题。而高级语言不需要理解计算机原理以及结构就能完成开发工作,在以后从事二进制安全的工作中,如果不对底层逻辑有着深刻的认识,那么我将会碰到难以计数的坑。当然,汇编语言只是一个技能,每个语言都有其独特的魅力,作为计算机从业者应该热爱每一个独特的语言。

        

        

0x02 汇编语言的由来

        从世界上第一台电子计算机问世,当时的电子计算机采用机器语言来完成输入输出等运算工作。而电子计算机是一串二进制数字通过计算机读取指令转换为高低电平后来完成相关运算。在计算机中,人们使用一个芯片来完成这些功能,它就是 CPU (Central Processing Unit) 中文名称为中央处理单元。CPU 是一种微处理器,它直接或间接的控制着主机及其相关链接设备。

        为什么不继续使用机器语言?首先机器语言仍在使用,只是因为机器语言晦涩难懂,阅读性较差,且容易出错。高级语言不断地推陈出新使得机器语言和汇编语言的学习者大幅减少。

        

        

0x03 机器语言和汇编语言

机器语言计算: A = 2022 + 1008

0100 0001 0011 1101 11111100110 0010 1011 1111110000

        

汇编语言计算: A = 2022 + 1008

  1. MOV  AX,2022        
  2. ADD  AX,1008
  3. MOV  A,AX

解释说明:

        在汇编语言计算中,MOV表示传送,将 2022 传送给 AX 寄存器,ADD表示相加,将 1008 与 AX 寄存器中的数值相加,最后在使用 MOV 传送指令,将 AX 寄存器的值传送给 A 存储单元中。

        

汇编语言的三种指令形式:

        汇编指令 是汇编语言中使用的一些操作符和助记符

        伪指令 是用于对汇编过程进行控制的指令

        宏指令 是汇编语言中的一种伪指令,代表某功能的一段源程序

        

        

0x04 0和1构造万物

        在赛博世界中,0 和 1 构造世界万物。人们使用的手机、电脑、空调等,均是由 0 和 1 组成的二进制数字构建起来的互联网络世界。在汇编语言中经常使用二进制和十六进制,而我们日常常用的是十进制。要使用汇编语言,需要理解并掌握进制间的互相转换。

1.进制数的三要素

        进制数的三要素有 基数 进位规则 。在汇编语言中,数值后使用字母来区分各个进制, B 表示二进制(Binary),表示十六进制(Hexadecimal), D 表示十进制(Decimal)。

        

二进制的要素

数码:0、1
基数:2
权:2 的 N-1 次方
进位规则:逢二进一

        

十进制的要素

数码:0、1、2、3、4、5、6、7、8、9
基数:10
权:10 的 N-1 次方
进位规则:逢十进一

        

十六进制的要素

数码:0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F
基数:16
权:16 的 N-1 次方
进位规则:逢十六进一

        

2.各进制数值对照表

十进制二进制十六进制八进制
0000
1111
21022
31133
410044
510155
611066
711177
81000810
91001911
101010A12
111011B13
121100C14
131101D15
141110E16
151111F17

        

3.二进制权值对照表

2^{0}= 1B2^{11}=2048=2K2^{22}=4M2^{33}=8G
2^{1}=2B2^{12}=4096=4K2^{23}=8M2^{34}=16G
2^{2}=4B2^{13}=8192=8K2^{24}=16M2^{35}=32G
2^{3}=8B2^{14}=16384 = 16K2^{25}=32M2^{36}=64G
2^{4}=16B2^{15}=32768 = 32K2^{26}=64M2^{37}=128G
2^{5}=32B2^{16}=65536 = 64K2^{27}=128M2^{38}=256G
2^{6}=64B2^{17}=131072 = 128K2^{28}=256M2^{39}=512G
2^{7}=128B2^{18}=262144 = 256K2^{29}=512M2^{40}=1024G=1T
2^{8}=256B2^{19}=524288 = 512K2^{30}=1024M=1G2^{41}=2T
2^{9}=512B2^{20}=1048576 = 1024K=1M2^{31}=2G2^{42}=4T
2^{10}=1024=1K2^{21}=2097152=2048K=2M2^{32}=4G2^{43}=8T

        

4.计算机存储容量换算关系

8 Bits = 1 Byte
1024Byte = 1KB
1024KB = 1MB
1024MB = 1GB
1024GB = 1TB
1024TB = 1PB
1024PB = 1EB
1024EB = 1ZB

        计算机存储单位一般用字节(Byte)、千字节(KB)、兆字节(MB)、吉字节(GB)、太字节(TB)、拍字节(PB)、艾字节(EB)、泽它字节(ZB,又称皆字节)、尧它字节(YB)表示。

        

        

0x05 进制转换

1.十进制转换二进制

例1.给定一个整数 2023 将其转换为二进制数

8421赋值法

解释说明:

        从左往右依次对比 2023 ,因为 2023 小于 2048 ,所以排除 4096 。继续对比 2023 小于 2048 那么记 0 且将 2023 向右移动与 1024 对比,比 1024 大,那么记 1 且将 2023 减去数 1024 值为 999 继续对比数 512 ,比 512 大,那么记 1 且减去 512 值 487 继续对比 256 比 256 大,那么记 1 减去 256 值为 231......39 比 32 大,记 1 减去值为 7 。7 比 16 小,那么记 0 向右移动,比 8 小 记 0 向右移动,比 4 大 记 1 减 4 值为 3 ,比 2 大 记 1 减 2 值为 1 ,末尾相等记 1 ,小于则记 0 ,最后第三行表示转后后的二进制数。

        

 例2.给定一个小数 0.125 将其转换为二进制小数

乘积取整法

解释说明:

        开始为 0. 表示小数,0.125*2 值为 0.25 不大于 1 那么记 0 ,0.25*2 值为 0.5 不大于 1 那么记0,0.5*2 值为 1 等于 1 那么记 1 。最后得出 0.125 转换的二进制小数为 0.001 。需要注意的是,如果乘积大于 1 记 1 后需要减去 1 将其变为小数继续与 2 相乘,如果最后的乘积不能为纯整数,说明此十进制小数不能精确转换为二进制小数,那么可以取若干位数近似值即可。

        

2.十进制转换八进制

例1.给定一个整数 2023 将其转换为八进制数

除基取余法

解释说明:

        将 2023 除 8 值为 252 余 7,继续将 252 除 8 值为 31 余 4,将 31 除 8 值为 3 余 7,最后 3 小于 8 余 3 。那么将 2023 转换为八进制数表示为 3747 。

        

3.十进制转换十六进制

例1.给定一个整数 2023 将其转换为十六进制数

除基取余法

解释说明:

        将 2023 除 16 值为 126 余 7,继续将 126 除 16 值为 7 余 7,将 31 除 16 值为 3 余 7,那么将 2023 转换为十六进制数表示为 7E7 。

        

4.二进制转换八进制

例1.给定一个二进制数 011111100111 将其转换为八进制数

取三合一法

解释说明:

        将二进制数从右往左,每三位为一位分成第二行,从左往右方法也适用。那么第二行的二进制数均为八进制数数码。如果不熟练可以参照各进制数值对照表。

        

        

5.二进制转换十进制

例1.给定一个二进制数 011111100111 将其转换为十进制数

权值累加法

解释说明:

        将二进制数从右往左依次从 2 的 0 次方对应,倒数第二位则为 2 的 1 次方,倒数第三位则为 2 的 2 次方,依此类推。最后将第一行数值与第二行的数值相乘,得到第三行的数相加即为转换后的十进制数 2023 。

        

6.二进制转换十六进制

例1.给定一个二进制数 011111100111 将其转换为十六进制数

取四合一法

解释说明:

        将二进制数从右往左,每四位为一位,从左往右方法也适用。那么二进制数均为十六进制数数码。如果不熟练可以参照各进制数值对照表。

        

7.十六进制转换二进制

例1.给定一个十六进制数 7E7 将其转换为二进制数

8421赋值法

解释说明:

        使用 8421 赋值法先将 7 转换为二进制数,可以将蓝色方块看成 8 4 2 1 ,那么 7 应该为 4 2 1 ,不记 8 。将不记录的表示 0 ,记录的表示 1 。即可得到转换的二进制数,那么十六进制数 7E7 转换二进制数为 011111100111 。

        

8.十六进制转换十进制

例1.给定一个十六进制数 7E7 将其转换为十进制数

权值累加法

解释说明:

        使用权值累加法从右往左,末尾十六进制数乘以 16 的 0 次方,倒数第二位十六进制数乘以 16 的 1 次方,依此类推。最后计算第二行累加第三行的值为转换后的十进制数 2023 。

        

        

0x06 进制运算

 1.二进制运算

例1.计算二进制数

解释说明:

        从末位开始第一行和第二行如果有 0 则记 1,如果第一行和第二行均为 1 则根据二进制的规则逢二进一,因为已经进到上一列,那么倒数第二列则记 0 。倒数第三行同样均为 1 ,那么同样逢二进一到上一列,因为之前倒数第二列进一,那么倒数第三行记 1 ,依此类推得到 4045 的二进制数 111111001101 。

2.十六进制运算

        在汇编语言中,只需要掌握十六进制的加、减、乘。运算规则参照逢十六进一。

        

例1.计算十六进制数的加法

解释说明:

       从末位开始第一行和第二行相加,逢十六进一。7 加 6 为 13 十六进制表示 D ,E 加 E 表示 14 加 14 ,为 28 进一余 12 十六进制表示 C ,7 加 7 加进一为 15 十六进制表示 F ,最后计算出 2023 加 2022 的十六进制表示为 FCD 。

        

例2.计算十六进制数的减法

解释说明:

       减法相对简单,从末位第一行减第二行减到最高位,最后得出 2023 减去 2022 的二进制表示为 001 。

        

例3.计算十六进制数的乘法

解释说明:

       乘法相对复杂,先乘个位数,逢十六进一,再乘十位数,最后乘百位数。将蓝色块、橙色块、绿色块的数相加得到十六进制数的 4090506 。

        

        

0x07 补码运算

1.计算机中的正负

        一个数在计算机的二进制表示形式,叫做这个数的机器数。在计算机中表示正负符号的最简单方法就是用 0 和 1 表示,用 0 表示正数,用 1 表示负数。它们写在二进制的最高位作为符号位。

例1.+2023和-2023的表示形式

解释说明:

        其中 011111100111 表示正数 2023 , 111111100111 表示负数 2023 。

        在计算机中,对带符号的数可以用 真值 机器数 两个概念表示。真值指的是日常生活中带有正号和负号的实际数值,机器数则是把正号和负号数值化后所得到计算机实际表示的数。

        

2.计算机的数据表示

字:16位二进制数1 字等于 2 字节,例 0001101010101001B 或 1AA9
字节:8位二进制数例 11010101B 或 D5
双字:32位二进制数1 双字等于 4 字节,又称双精度数,例 23456789H

        

3.原码

原码将最高位作为符号位,正数为 0 ,负数为 1 。其余位表示数值位。

例1.+2023和-2023的原码表示

原码

解释说明:

        原码最高位表示符号正负,其余位表示数值。

        

4.反码

正数的反码与正数的原码一样,负数的反码,符号位表示 1 ,数值为取反。

反码

解释说明:

        符号位不变,数值位全部取反,如果是 1 取反为 0 ,如果是 0 取反 为 1 。

        

5.补码

正数的补码与正数的原码一样,负数的补码,符号位为 1 ,数值为其反码在加 1 。

补码

解释说明:

        负数的补码符号位不变,数值位表示其原码基础上得出的反码在加 1 。

        

        

0x07 解码和编码

1.解码

        解码是一种用特定方法,把数码还原成它所代表的内容或将信号转换成信息数据的过程。解码是将接受到的符号或代码还原为信息的过程,与编码过程相对应。汇编语言中主要介绍编码的过程及使用,对解码做一定的了解即可。

        

2.编码

        编码就是按一定规则组合形成的若干二进制码来表示的数或字符。

        因为计算机只能理解二进制数,而我们日常生活中使用的经常是十进制数。要使计算机能理解十进制数正常运行,需要对其进行编码。在计算机编码中,对十进制的十个数码采用二进制编码表示,称作 BCD 码。

2.1二一十进制BCD码表

十进制数8421码2421码余3码
0000000000011
1000100010100
2001000100101
3001100110110
4010001000111
5010110111000
6011011001001
7011111011010
8100011101011
9100111111100

        BCD 码使用四位二进制数表示一位十进制数,如果这四位二进制数的各位之权从左到右分别为 8、4、2、1 ,那么称为 8421 码。0~10 这十进制数中的 8421 码与二进制数没有区别,需要注意的是在 8421 码中没有 1010~1111 这 6 个二进制数。余3码则是在 8421 码的基础上加 3 ,因此称为余3码。

        2421 码各位之权从左到右分别为 2、4、2、1,特点是大于等于 5 的数最高位为 1 ,小于 5 的数最高位为 0 。8421 码和 2421 码为有权码,余3码为无权码。有权码和无权码区别是每一位是否有权值。

        

3.可靠性编码

        二进制代码在传输过程时容易发生错误,可能会因为网络原因会造成传输过程中数据丢失。为了能够及时发现错误,计算机学家们采用了 可靠性编码 对数据进行验证。

        

3.1 8421 奇偶效验码表

8421码8421奇校验码8421偶校验码
8421校验位8421校验位
00001 00000 0000
00010 00011 0001
00100 00101 0010
00111 00110 0011
01000 00101 0100
01011 01010 0101
01101 01100 0110
01110 01111 0111
10000 10001 1000
10011 10010 1001

        奇偶校验码是根据数据位的最高位之前加一个校验位组成的,如果整个编码中 1 的个数是奇数,那么称为奇数校验码;如果是偶数,那么称为偶数校验码。

        

2.3ASCII码表

ASCII值

控制字符

ASCII值

控制字符

ASCII值

控制字符

ASCII值

控制字符

十进制十六进制十进制十六进制十进制十六进制十进制十六进制

0

0

NUL

32

20

(space)

64

40

@

96

60

1

1

SOH

33

21

65

41

A

97

61

a

2

2

STX

34

22

66

42

B

98

62

b

3

3

ETX

35

23

#

67

43

C

99

63

c

4

4

EOT

36

24

$

68

44

D

100

64

d

5

5

ENQ

37

25

%

69

45

E

101

65

e

6

6

ACK

38

26

&

70

46

F

102

66

f

7

7

BEL

39

27

'

71

47

G

103

67

g

8

8

BS

40

28

(

72

48

H

104

68

h

9

9

HT

41

29

)

73

49

I

105

69

i

10

0A

LF

42

2A

*

74

4A

J

106

6A

j

11

0B

VT

43

2B

+

75

4B

K

107

6B

k

12

0C

FF

44

2C

,

76

4C

L

108

6C

l

13

0D

CR

45

2D

-

77

4D

M

109

6D

m

14

0E

SO

46

2E

.

78

4E

N

110

6E

n

15

0F

SI

47

2F

/

79

4F

O

111

6F

o

16

10

DLE

48

30

0

80

50

P

112

70

p

17

11

DCI

49

31

1

81

51

Q

113

71

q

18

12

DC2

50

32

2

82

52

R

114

72

r

19

13

DC3

51

33

3

83

53

X

115

73

s

20

14

DC4

52

34

4

84

54

T

116

74

t

21

15

NAK

53

35

5

85

55

U

117

75

u

22

16

SYN

54

36

6

86

56

V

118

76

v

23

17

TB

55

37

7

87

57

W

119

77

w

24

18

CAN

56

38

8

88

58

X

120

78

x

25

19

EM

57

39

9

89

59

Y

121

79

y

26

1A

SUB

58

3A

:

90

5A

Z

122

7A

z

27

1B

ESC

59

3B

;

91

5B

[

123

7B

{

28

1C

FS

60

3C

92

5C

\

124

7C

|

29

1D

GS

61

3D

=

93

5D

]

125

7D

}

30

1E

RS

62

3E

94

5E

^

126

7E

~

31

1F

US

63

3F

?

95

5F

127

7F

DEL

NUL    空VT    垂直制表SYN    空转同步
SOH    标题开始FF    走纸控制ETB    信息组传送结束
STX    正文开始CR    回车CAN    作废
ETX    正文结束SO    移位输出EM    纸尽
EOT    传输结束SI    移位输入SUB    换置
ENQ    询问字符DLE    数据传送换码ESC    换码
ACK    承认DC1    设备控制1FS    文字分隔符
BEL    报警DC2    设备控制2GS    组分隔符
BS    退一格DC3    设备控制3RS    记录分隔符
HT    横向列表DC4    设备控制4US    单元分隔符
LF    换行NAK    否定DEL    删除

        ASCII 是电脑编码系统,它是通用的信息交换标准,等同于国际标准 ISO/IEC 646。共定义了 128 个字符 ,在汇编语言中主要掌握以上 ASCII 编码。

        

        

0x08 参考文献

[1].郑晓薇. 汇编语言[M]. 2013年11月第1版. 北京:机械工业出版社, 2013-11-01.

[2].王爽. 汇编语言[M]. 2019年12月第4版. 北京:清华大学出版社, 2019-12-01.

[3].百度百科. 伪指令[EB/OL]. [2022-10-08]. https://baike.baidu.com/item/%E4%BC%AA%E6%8C%87%E4%BB%A4/4309381.

[4].百度百科. 宏指令[EB/OL]. [2022-10-08]. https://baike.baidu.com/item/%E5%AE%8F%E6%8C%87%E4%BB%A4/10705261.

[5].百度百科. 拍字节[EB/OL]. [2022-10-08]. https://baike.baidu.com/item/%E6%8B%8D%E5%AD%97%E8%8A%82/1453828?fromtitle=PB&fromid=399855#viewPageContent.

[6].百度百科. 汇编语言[EB/OL]. [2022-10-08]. https://baike.baidu.com/item/%E6%B1%87%E7%BC%96%E8%AF%AD%E8%A8%80/61826.

[7].chee. 十进制转成二进制的两种方式[EB/OL]. [2022-10-08]. https://zhuanlan.zhihu.com/p/159127499.

[8].海南学子. 进制的转换方法[EB/OL]. [2022-10-08]. https://www.zhihu.com/question/63035189.

[9].攻城狮Kevin. 二进制、十进制、十六进制之间的相互转换[EB/OL]. [2022-10-08]. https://blog.csdn.net/wx1528159409/article/details/83512502.

[10].MClink. 原码、反码、补码运算规则[EB/OL]. [2022-10-08]. https://s.r.sn.cn/Y995Gd.

[11].百度百科. 解码[EB/OL]. [2022-10-08]. https://baike.baidu.com/item/%E8%A7%A3%E7%A0%81/10944752.

[12].百度百科. 无权码[EB/OL]. [2022-10-08]. https://baike.baidu.com/item/%E6%97%A0%E6%9D%83%E7%A0%81/5916558.

        

        

0x09 总结

文章主要通过深入浅出的方式记录汇编语言的学习过程,文中若有错误与不足欢迎留言,便于及时更正。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/461006
推荐阅读
相关标签
  

闽ICP备14008679号