由于工作需要,上次要写个程式从读取LCD的edid rom上相关信息,用到一些汇编知识,最近有时间将汇编拿出来翻一番,复习一下,记笔记如下
汇编基础知识学习整理(一)
参考书:王爽《汇编语言》
国内人写的很不错的很易入手的一本书
1.基础知识
1.cpu要想进行数据的读写,必须和外部器件进行信息交互,
a, 存储单元的地址(地址信息)
b,器件的选择,读或写的命令(控制信息)
c,读或写的数据(数据信息)
那么就有与上面相对应的三种总线,地址线,数据线,控制线。
2.一个CPU有N根地址总线,那么最多可以寻址2的N次方个内存单元
3.所有的物理存储器(诸如显卡BIOS ROM,网卡BIOS ROM等等)被看作一个由若干存储单元组成的逻辑存储器,每个物理存储器在这个逻辑存储器中占有一个地址段,即一段地址空间。CPU在这段地址空间上读写数据实际上就是在相对应的物理存储器中读写数据。
4.8086可以一次性处理两种尺寸的数据,
一是字节:byte,一个字节由8个bit组成,可以放在8位寄存器中。
二是字,word,一个字由两个字节组成,这两个字节分别称为高位字节和低位字节
5.16位结构的CPU具有以下结构特征:
a,运算器一次最多可以处理16位的数据
b,寄存器最大宽度为16位
c,寄存器和运算器之间的通路为16位
6.8086CPU有20位地址总线(达到1MB寻址能力)和其是16位的结构是一个矛盾
8086CPU采用用两个16位地址来合成一个20位的地址的办法来解决,一个成为段地址,一个称为偏移地址
物理地址=段地址*16+偏移地址
偏移地址为16位,16位地址的寻址能力为64KB,所以一个段的最大长度为64KB。
两种说法:
数据存在内存2000:1F60单元中
数据在内存的2000段中的1F60的单元中
7.断寄存器
CS为代码段寄存器,IP为指令指针寄存器
任意时刻,CPU将CS:IP指向的内容当作指令运行
8.mov指令不能用于设置CS和IP的值,能够修改其值的指令被统称为转移指令,诸如jmp 2AE3:3
若仅仅想修改IP的内容,则只需 jmp 某一合法寄存器,如:jmp ax(类似move IP,ax,但其实没有这样的命令)
9.8086CPU的工作过程简要描述如下:
a,从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器;
b,IP=IP+所读指令的长度,从而指向下一条指令
c,执行指令,转到a,重复
10.8086CPU加电或复位后(即CPU刚刚开始工作时)CS和IP被设置成CS:FFFFH,IP被设置成0000H,即机器刚启动时从 FFFF0H内存单元读取指令执行第一条
11.8086CPU中有一个DS寄存器,通常用来存放要访问的数据的段地址。
8086CPU不支持将数据直接送进段寄存器
12.
栈是一种具有特殊访问方式的存储空间。他的特殊性在于,最后进入这个空间的数据最先出去。
LIFO(Last In First Out)
两种基本操作:入栈(PUSH)和出栈(POP)
13.CPU提供的栈机制:push ax表示将寄存器ax中的数据送入栈中,pop bx表示将从栈顶取出数据放到bx,8086CPU的出栈和入栈操作都是以字为单位进行的
14.断寄存器SS用来存放栈顶的段地址,寄存器SP存放偏移地址。也就是任意时刻,SS:SP指向栈顶元素
push ax的执行:
a,SP=SP-2,SS:SP指向当前栈顶的前面的的单元,以当前栈顶前面的单元为新的栈顶;
b,将ax中的内容送进 SS:SP指向的内存单元,SS:SP此时指向新的栈顶
pop ax的执行正好与push相反
a,将SS:SP指向的内存单元的数据送入 ax中
b,SP=SP+2,SS:SP指向当前栈顶下面的单元
15,汇编编译器可用:微软masm5.0,连接器用微软的overlay linker3.60
可参考http://www.cnblogs.com/del/archive/2010/04/02/1703457.html
他推荐了RadAsm 这个工具
16.微软自带的debug工具的使用