赞
踩
文章目录
汇编语言是计算机提供给用户的最快最有效的语言,也是能够利用计算机的所有硬件特性并能够直接控制硬件的唯一语言。但是由于编写和调试汇编语言程序要比高级语言复杂,因此目前其应用不如高级语言广泛。通过汇编语言的学习,可以具有在 CPU 的寄存器级上进行控制和操作的能力,获得直接对计算机硬件底层编程经验,从而对计算机系统有更深刻的认识。
首先我个人学习汇编语言主要是为了对二进制安全方面有一个更加深入的认识,通过掌握汇编指令完成对程序代码的调试工作。学会了汇编语言,不仅可以对计算机底层逻辑有更加深刻的理解,还可以在以后的工作中,从底层逻辑的角度更加深入的分析问题。而高级语言不需要理解计算机原理以及结构就能完成开发工作,在以后从事二进制安全的工作中,如果不对底层逻辑有着深刻的认识,那么我将会碰到难以计数的坑。当然,汇编语言只是一个技能,每个语言都有其独特的魅力,作为计算机从业者应该热爱每一个独特的语言。
从世界上第一台电子计算机问世,当时的电子计算机采用机器语言来完成输入输出等运算工作。而电子计算机是一串二进制数字通过计算机读取指令转换为高低电平后来完成相关运算。在计算机中,人们使用一个芯片来完成这些功能,它就是 CPU (Central Processing Unit) 中文名称为中央处理单元。CPU 是一种微处理器,它直接或间接的控制着主机及其相关链接设备。
为什么不继续使用机器语言?首先机器语言仍在使用,只是因为机器语言晦涩难懂,阅读性较差,且容易出错。高级语言不断地推陈出新使得机器语言和汇编语言的学习者大幅减少。
机器语言计算: A = 2022 + 1008
0100 0001 0011 1101 11111100110 0010 1011 1111110000
汇编语言计算: A = 2022 + 1008
- MOV AX,2022
-
- ADD AX,1008
-
- MOV A,AX
解释说明:
在汇编语言计算中,MOV表示传送,将 2022 传送给 AX 寄存器,ADD表示相加,将 1008 与 AX 寄存器中的数值相加,最后在使用 MOV 传送指令,将 AX 寄存器的值传送给 A 存储单元中。
汇编语言的三种指令形式:
汇编指令 :是汇编语言中使用的一些操作符和助记符
伪指令 :是用于对汇编过程进行控制的指令
宏指令 :是汇编语言中的一种伪指令,代表某功能的一段源程序
在赛博世界中,0 和 1 构造世界万物。人们使用的手机、电脑、空调等,均是由 0 和 1 组成的二进制数字构建起来的互联网络世界。在汇编语言中经常使用二进制和十六进制,而我们日常常用的是十进制。要使用汇编语言,需要理解并掌握进制间的互相转换。
1.进制数的三要素
进制数的三要素有 基数 、 权 、 进位规则 。在汇编语言中,数值后使用字母来区分各个进制, B 表示二进制(Binary), H 表示十六进制(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.各进制数值对照表
十进制 | 二进制 | 十六进制 | 八进制 |
0 | 0 | 0 | 0 |
1 | 1 | 1 | 1 |
2 | 10 | 2 | 2 |
3 | 11 | 3 | 3 |
4 | 100 | 4 | 4 |
5 | 101 | 5 | 5 |
6 | 110 | 6 | 6 |
7 | 111 | 7 | 7 |
8 | 1000 | 8 | 10 |
9 | 1001 | 9 | 11 |
10 | 1010 | A | 12 |
11 | 1011 | B | 13 |
12 | 1100 | C | 14 |
13 | 1101 | D | 15 |
14 | 1110 | E | 16 |
15 | 1111 | F | 17 |
3.二进制权值对照表
4.计算机存储容量换算关系
计算机存储单位一般用字节(Byte)、千字节(KB)、兆字节(MB)、吉字节(GB)、太字节(TB)、拍字节(PB)、艾字节(EB)、泽它字节(ZB,又称皆字节)、尧它字节(YB)表示。
1.十进制转换二进制
例1.给定一个整数 2023 将其转换为二进制数
解释说明:
从左往右依次对比 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 赋值法先将 7 转换为二进制数,可以将蓝色方块看成 8 4 2 1 ,那么 7 应该为 4 2 1 ,不记 8 。将不记录的表示 0 ,记录的表示 1 。即可得到转换的二进制数,那么十六进制数 7E7 转换二进制数为 011111100111 。
8.十六进制转换十进制
例1.给定一个十六进制数 7E7 将其转换为十进制数
解释说明:
使用权值累加法从右往左,末尾十六进制数乘以 16 的 0 次方,倒数第二位十六进制数乘以 16 的 1 次方,依此类推。最后计算第二行累加第三行的值为转换后的十进制数 2023 。
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 。
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 。
1.解码
解码是一种用特定方法,把数码还原成它所代表的内容或将信号转换成信息数据的过程。解码是将接受到的符号或代码还原为信息的过程,与编码过程相对应。汇编语言中主要介绍编码的过程及使用,对解码做一定的了解即可。
2.编码
编码就是按一定规则组合形成的若干二进制码来表示的数或字符。
因为计算机只能理解二进制数,而我们日常生活中使用的经常是十进制数。要使计算机能理解十进制数正常运行,需要对其进行编码。在计算机编码中,对十进制的十个数码采用二进制编码表示,称作 BCD 码。
2.1二一十进制BCD码表
十进制数 | 8421码 | 2421码 | 余3码 |
0 | 0000 | 0000 | 0011 |
1 | 0001 | 0001 | 0100 |
2 | 0010 | 0010 | 0101 |
3 | 0011 | 0011 | 0110 |
4 | 0100 | 0100 | 0111 |
5 | 0101 | 1011 | 1000 |
6 | 0110 | 1100 | 1001 |
7 | 0111 | 1101 | 1010 |
8 | 1000 | 1110 | 1011 |
9 | 1001 | 1111 | 1100 |
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校验位 | |
0000 | 1 0000 | 0 0000 |
0001 | 0 0001 | 1 0001 |
0010 | 0 0010 | 1 0010 |
0011 | 1 0011 | 0 0011 |
0100 | 0 0010 | 1 0100 |
0101 | 1 0101 | 0 0101 |
0110 | 1 0110 | 0 0110 |
0111 | 0 0111 | 1 0111 |
1000 | 0 1000 | 1 1000 |
1001 | 1 1001 | 0 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 设备控制1 | FS 文字分隔符 | |||||||||
BEL 报警 | DC2 设备控制2 | GS 组分隔符 | |||||||||
BS 退一格 | DC3 设备控制3 | RS 记录分隔符 | |||||||||
HT 横向列表 | DC4 设备控制4 | US 单元分隔符 | |||||||||
LF 换行 | NAK 否定 | DEL 删除 |
ASCII 是电脑编码系统,它是通用的信息交换标准,等同于国际标准 ISO/IEC 646。共定义了 128 个字符 ,在汇编语言中主要掌握以上 ASCII 编码。
[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.
文章主要通过深入浅出的方式记录汇编语言的学习过程,文中若有错误与不足欢迎留言,便于及时更正。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。