汇编语言系列1
前言
本系列内容是我在学习汇编语言过程中学习的笔记与心得,部分内容参照王爽老师的《汇编语言》第三版,这本书给了我很大的帮助。
1. 基础内容
1.1 机器语言
机器语言是机器指令的集合,这些指令都是一串二进制数。
早期的程序均使用机器语言,通过将0、1数字体现在纸带上,1表示打孔,0不打孔,再通过纸带机送入计算机。相关内容可以参照其他资料,这里不再赘述了。
作为程序员肯定不会想去编写只有1和0的代码,不仅写起来费劲,还容易错,于是汇编语言诞生了。
1.2 计算机基本知识
想要立即汇编语言,必须掌握一些计算机组成的基本知识。
这里针对8088/8086CPU(以下简称CPU)简单介绍一下计算机组成部分。
-
CPU内部有
14
个寄存器,这些寄存器都是16位的。如何理解这个16位呢?先来梳理一下计算机中的计量单位。-
位(bit):最基本的单位,位只有两种,1和0。每个数字代表一个位,我们常说计算机软件是一串二进制数组成的,那么这串二进制的每一个字符就代表一个位。bit也称比特。
-
字节(Byte):我们已经知道位了,但是一个位实际上并没有实际的意义,在计算机中用的最多的是字节。包括我们使用的文件,传输的速率,都是以字节作为单位去计算。
1个字节 = 8个位,也即1Byte = 8 bit。
在计算机科学中,用于表示ASCII字符,例如字符A便用 “0100 0001”来表示。1个字节可以储存1个英文字母或半个汉字。 -
字(Word):代表计算机处理指令或数据的二进制数位数,是计算机进行数据存储和数据处理的运算的单位。字指的就是在CPU内部传输,处理,暂时存放的最大数据大小。在16位CPU(8086就是这种CPU)中,一字表示16位(2字节),双字代表32位(4字节)。在32位CPU中,一字表示32位(4字节),双字表示64位(8字节)。
从上面的描述我们不难得出:1字节=8位,这个关系是固定的;而1个字的长度是随CPU的变化而变化的,知道这些之后我们继续看下面。
-
-
CPU寄存器可以分为通用寄存器(8个),段寄存器(4个),控制寄存器(2个)。注意这里的寄存器,我们后面将频繁使用。
通用寄存器
AX BX CX DX (数据寄存器)
AX(Accumulate) 累加器
BX(Base) 基址寄存器
CX(Count) 计数寄存器
DX(Data) 数据寄存器======================================
SP BP 地址指针寄存器
SP(Stack Pointer) 堆栈指针寄存器
BP(Base Pointer) 基址指针寄存器======================================
SI DI 变址寄存器
SI(Source Index) 源变址寄存器
DI(Destination Index) 目的变址寄存器
段寄存器
CS(Code Segment) 代码段寄存器
SS(Stack Segment) 堆栈段寄存器
DS(Data Segment) 数据段寄存器
ES(Extra Segment) 附加数据段寄存器
控制寄存器
IP(Instruction Pointer) 指令指针寄存器
FLAGS 标志寄存器/程序状态字(PSW)
关于基础内容就先聊到这里,未提到的部分以后会补充。
1.3 汇编语言的组成
汇编语言有以下三个指令:
(1)汇编指令:机器码助记符,每个指令对应一个机器码。(核心)
(2)伪指令:由编译器执行,计算机不执行。无机器码对应。
(3)其他符号:加减乘除等符号,无机器码对应。
至此,最基本的内容就介绍完了,本章结束。更多精彩的部分会在下一篇文章中提及。其他未提及的基础部分可以参照 王爽《汇编语言》第三版
内容。
《汇编语言》第一章课后习题:
(1)1个CPU的寻址能力为8KB,那么它的地址总线的宽度为
13位
。— 8KB = 1024B*8 = 8192B ,相当于寻址能力为8192B,每一位都有0和1两种情况,要实现8192B,需要8192 = 2^N,N=13的总线宽度方可实现。(2)1KB的存储器有
1024
个存储单元,存储单元的编号从0
到1023
。(3)1KB的存储器可以存储
8192(2^13)
个bit,1024
个Byte。 建议记住这个数字:如果你有一个1KB的U盘,那么你就有了一个8192Bit的储存器,对应的N是13。(4)1GB是
2^30
个Byte、1MB是2^20
个Byte、1KB是2^10
个Byte。(5)8080、8088、80296、80386的地址总线宽度分别为16根、20根、24根、32根, 则它们的寻址能力分别为:
64
(KB)、1
(MB)、16
(MB)、4
(GB)。(6)8080、8088、8086、80286、80386的数据总线宽度分别为8根、8根、16根、16根、32根。则它们一次可以传送的数据为:
1
(B)、1
(B)、2
(B)、2
(B)、4
(B)。(7)从内存中读取1024字节的数据,8086至少要读
512
次,80386至少要读256
次。(8)在存储器中,数据和程序以
二进制
形式存放。