汇编语言学习笔记

在读《汇编语言》这本书学习汇编语言的时候,在此对每一章的要点进行总结和记录,以便日后复习与查看。 练习环境:Windows 2000 Professional,与书中程序运行环境一致。 第一章 基础知识 汇编语言是一门直接在硬件之上工作的编程语言。由于早期人们使用机器语言(一串二进制数字)进行编程存在不易纠错、晦涩难懂的缺点,所以发明了汇编语言来帮助程序员更高效的编程。汇编语言经编译连接之后可以直接形成由机器指令构成的程序,可以直接被CPU执行。而不同型号的CPU拥有不同的指令集,所以汇编语句对应的机器码可能不尽相同。这本书的汇编语言是基于8086CPU的指令集来进行描述的。 汇编语言包括三个部分: 汇编指令(核心部分):机器码的助记符,有对应的机器码 伪指令:由编译器执行,没有对应的机器码,计算机本身并不执行 其他符号:如+、-、*、/等,由编译器识别,没有对应机器码 汇编语言的指令和数据信息存放在存储器(内存)中。在内存中指令和数据并没有任何区别,本质上都是二进制信息。而决定一段二进制信息是指令还是数据,则由CPU工作时决定。存储器由若干个存储单元构成,单个存储单元的最小单位是字节(Byte,1Byte=8Bit)。 CPU想要进行数据的读写(包括存储器及一些外部器件),必须通过总线,与这些器件进行三类信息的交互(主线逻辑上也分为这三类): 地址信息:CPU首先通过地址总线将要读写的存储单元地址发出 控制信息:随后CPU通过控制总线发送控制命令(内存读/写命令、存储芯片片选命令) 数据信息:再通过数据总线将数据送入对应的存储单元/从对应的存储单元读出数据 一个CPU的地址总线有$N$根,那么可寻址的最多单元数为$2^N$,CPU能够寻址到的所有内存单元构成了这个CPU的内存地址空间;数据总线有$N$根,那么一次性可传输的数据位数为$N$;控制总线的宽度则决定了CPU对外部器件的控制能力。 CPU类型 地址总线宽度 数据总线宽度 寻址能力 一次可传送的数据量 8080 16 8 64KB 1B 8088 20 8 1MB 1B 8086 20 16 1MB 2B 80286 24 16 16MB 2B 80386 32 32 4GB 4B 在一台PC中,装有多个存储器芯片,这些存储器芯片从读写属性上分为RAM和ROM两类。RAM可读可写,但必须带点存储,掉电则内容丢失;ROM只可读不可写,掉电后数据不丢失。从功能上还可以分为三类: RAM:这就是我们平常所说的内存,用于存放CPU使用的绝大部分程序和数据 装有BIOS的ROM:主板和各接口卡均可以有,通过各自的BIOS可以实现基本的输入和输出 各接口卡的RAM:比如显卡上的显存 CPU将上述的所有存储器都当作是内存来看待,所以逻辑上可以将上述的所有存储器映射为一个存储器,也就是CPU的内存地址空间。每个物理存储器在这个逻辑存储器中占有一个地址段,CPU向这个地址段读写数据,就是在向对应的存储器读写数据。所以,我们在基于一个硬件系统编程时,必须要知道这个系统的内存地址空间分配情况。 8086PC的内存地址空间分配情况: 00000H~9FFFFH:主存地址空间(RAM) A0000H~BFFFFH:显存地址空间 C0000H~FFFFFH:各类ROM地址空间 第二章 寄存器 计算机组成原理中有提到:一个计算机系统除了I/O设备外,还有三大部件:运算器、控制器、存储器。其实这三大部件在CPU中也是存在的,它们在CPU中通过CPU内部的总线实现连接和信息传递。 运算器:进行信息处理和运算 控制器:控制各器件进行工作 存储器(寄存器):存储信息 而对于汇编语言来说,CPU中主要的部件就是寄存器。因为程序员可以通过汇编指令来读写寄存器,从而实现对CPU的控制。 不同的CPU寄存器的个数和结构也不尽相同。8086CPU中有14个寄存器,分别为:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。8086CPU中所有的寄存器都是16位(2B)的。 AX、BX、CX、DX这四个寄存器通常用来存放一般的数据,被称为通用寄存器。由于8086CPU上一代的CPU的寄存器都是8位(1B)的,为了保证兼容性,这四个通用寄存器也都可以分为两个8位的寄存器来使用,高位部分称为xH,低位部分称为xL(举例:AX高位为AH,低位为AL)。 8086CPU可以一次性处理一个字节(Byte)或一个字(Word,即两个字节)大小的数据。字型数据存储在寄存器里时,高8位数据存储在寄存器的高位部分,低8位存储在寄存器的低8位部分。 几条汇编指令: 指令 语法 功能 高级语言描述 mov mov a, b 将b数据放进a中 a = b add add a, b 将a和b相加,结果存储在a中 a = a + b sub sub a, b 将a和b相减,结果存储在a中 a = a - b 注意:上述指令的两个操作对象的数据位数必须一致;当最高位产生进位时,进位值不能存储,将会丢失(但这个进位值并未真正被丢弃)...

Feb. 20, 2020 · 12 min · 2517 words