自学王爽老师编写的汇编语言一书有一段时间了,开一个博客记录一下自己这段时间的学习。
一.基础知识
1.机器语言:机器指令的集合。
2.汇编语言的主体:汇编指令。
3.汇编语言的组成:汇编指令+伪指令+其他符号。
*指令和数据是应用上的概念,在内存中二者无任何区别。
4.存储单元从0开始编号。比特(bit/位)——字节(Byte/B) 1kB=1024B
5.CPU对存储器的读写:
(1)地址总线:一个CPU有N个地址总线,则CPU宽度为N,其可寻找2的N次方个内存单元。
//因为CPU一根导线只有高电平和低电平两种状态,分别是二进制里的1,0。比如10根导线的寻址范围是0—1023
(2)数据总线:其宽度决定了CPU与外界的数据传送速度。8086CPU数据总线宽度为16,可一次传送16位数据。
(3)控制总线:是一些不同控制线的集合,其宽度决定了CPU对外部器件的控制能力。
6.主板:每台PC中都有一个主板,主板上有核心器件和主要器件,由总线互相连接。这些器件有CPU、存储器、外围芯片组、扩展插槽等组成。扩展插槽上一般插有RAM内存条和各类接口卡。
7.接口卡:扩展插槽通过总线和CPU相连,所以接口卡也通过总线和CPU相连。CPU通过控制接口卡间接对外围设备进行控制。
8.各类存储器芯片:
(1)随机存储器(RAM):用于存放CPU使用的绝大部分程序和数据,主随机存储器一般由装在主板上的RAM和装在扩展插槽上的RAM组成。
(2)装有BIOS(Basic input/output system)的ROM:可以通过BIOS对硬件设备进行基本的输入输出。
(3)接口卡上的ROM:某些接口卡(比如GPU)需要对大批量输入的数据进行暂时储存,在其上装有RAM(比如显存)
*以上三类存储器,有两个共同点:
(1):都和CPU总线相连。
(2)CPU对它们进行读或写的时候都通过控制总线发出内存读写命令。
9.内存地址空间:
在汇编里,我们面对的是计算机里的内存空间,要在脑海里构建好逻辑模型。内存地址空间的大小受CPU地址总线宽度的限制。我们在基于硬件编程时,必须知道这个系统中内存分配情况。
二.寄存器
CPU由运算器,控制器,寄存器等器件构成,它们之间由总线相连接。
(1)运算器进行信息处理。
(2)寄存器进行信息存储。
(3)控制器控制各种器件进行工作。
(4)内部总线连接各种器件,在它们之间进行数据的传送。
对一个汇编程序员来说,CPU中的主要部件是寄存器。寄存器是CPU中程序员可以用指令读写的部件。程序员通过改变寄存器中的内容来对CPU进行控制。8086CPU有14个寄存器,分别为AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES,PSW。
1.通用寄存器:
8086CPU所有寄存器都是16位的,可以存放两个字节。其中AX,BX,CX,DX可以存放一般性数据,被称为通用寄存器。逻辑内存空间从0—15,其中0-7是低8位,用L表示,8-15为高8位,用H表示。AX可分为AL和AH,其他三个同理。
2.字在寄存器中的存储:
8086CPU可一次性处理一下两种尺寸的数据:
(1)字节(Byte)(2)字(word),一个字由两个字节组成,分别称为这个字的高位字节和低位字节。一个字放在一个16位 寄存器中。
*我们在汇编中常用16进制,16进制的一个位相当于二进制的4个位。如0100 1110 0010 0000拆开看可表示为4E20。16进制后加后缀H,2进制加B
3.几条汇编指令
(终于开始编程了~)
mov ax,18——表示将18送入寄存器AX
mov ah,78——表示将78送入寄存器AH
mov ax,bx——表示将bx的数据送入ax
add ax,8——表示将ax中的数据加8
add ax,bx——表示将bx的数据加给ax
*在写一条汇编指令或一个寄存器的名称时不区分大小写。
*有时我们作相加运算会溢出,比如这两个语句:
mov al,C5H
add al,93H
执行完后溢出的高位丢失,al为0058H,数据不会放到ah里,因为此时把al和ah当做互不相干的两个8位寄存器。
4.物理地址
每一个实际存在的内存单元在逻辑内存空间中有一个唯一的地址,称为物理地址。CPU要对其操作时,必须先形成这个物理地址。
5.8086CPU给出物理地址的方法:
上文已经提到,8086CPU是16位机,即运算器一次最多可处理16位数据、寄存器最大宽度为16位、寄存器和运算器之间通路为16位。而8086CPU的地址总线宽度为20,那么如何生成这个20位的地址呢?
*8086CPU采用一种在内部用两个16位地址合成的办法来形成一个20位的物理地址。
具体过程:
(1)CPU提供两个16位地址,一个称为段地址,另一个是偏移地址。
(2)这两个地址通过内部总线传递给地址加法器。
(3)地址加法器将两个地址合成为一个20位的地址数据。
(4)地址加法器把20位地址传递给输入输出控制电路。
(5)输入输出控制电路将20位地址送上地址总线。
(6)20位物理地址被地址总线传送到存储器。
*地址加法器采用物理地址=段地址x16+偏移地址的方法合成物理地址。