标签:
1. 什么是寄存器呢? 就是可以用指令进行读写的部件. 程序员通过改变各种寄存器中的内容实现对CPU的控制. 如果是16位CPU的话, 就是相当于2个存储单元.
2. 字在寄存器中的存储? 8086CPU可以一次性处理两种尺寸的数据
Byte: 字节型数据, 一个字节由8个bit组成, 可以存在8位寄存器中.
Word: 字型数据, 一个字型由16个bit组成, 也就是两个字节, 称为这个字的高位字节和低位字节.
3. 常用汇编指令的学习(需要注意的是汇编指令是不区分大小写的)
mov ax, 3 将3送入寄存器ax
mov bx, 5 将5送入寄存器bx
add ax, 4 将寄存器ax中的值加4
mov ax, bx 将bx中的数据送入ax中
add ax, bx 将ax中的值和bx中的值相加的结果放入ax中
注意事项: 在进行数据传送和运算时, 要注意指令的两个操作对象的位数应当是一致的.
4. 物理地址: 所以的存储单元构成的存储空间是一个一维的线性空间, 每一个内存单元在这个存储空间中都有唯一的地址, 我们将这个唯一的地址称为物理地址.
物理地址怎么来的呢? 物理地址 = 段地址*16 + 偏移地址
5. 什么是16位结构的CPU?
a. 运算器一次可以处理16位的数据 处理
b. 寄存器的最大宽度为16位 暂存
c. 运算器和寄存器之间的通路为16位 传输
不是总结的总结:
总结1. 一个数据的二进制形式左移一位, 相当于该数据乘以2
一个数据的二进制形式左移N位, 相当于该数据乘以2的N次方
总结2. 一个数据的二进制形式左移一位, 相当于该数据乘以2
一个数据的十进制形式左移一位, 相当于该数据乘以10
一个数据的十六进制形式左移一位, 相当于该数据乘以16
一个数据的N进制形式左移一位, 相当于该数据乘以N
6. 段的概念: 其实内存并没有分段, 段的划分来自于CPU, 因为内存里面就是二进制数据, 没有什么段.
如果段地址是固定的, 变化偏移地址, 而16位的CPU, 变化范围为0 - FFFF, 也就是说最多可以寻64KB个内存单元.
7. 段寄存器: 8086CPU有四个段寄存器: CS, DS, ES, SS
CS(Code Segment)为代码段寄存器, 这个段一般用于存放代码, 通常和IP一起使用, 用于处理下一条执行的代码.
DS(Data Segment)为数据段寄存器, 用于存放数据, 相当C语言中的全局变量
ES(Extra Segment)为扩展寄存器
SS(Stack Segment)为栈段寄存器, 作为栈来使用, 通常和SP一起使用, 存放的数据相当于C语言中的局部变量
SS为栈段的首地址, SP为栈段的偏移地址
8. IP指令指针寄存器
在CPU中我们能够用指令读写的部件只有寄存器, 我们可以通过改变寄存器中的内容实现对CPU的控制.
通过jmp转移指令来改变CS:IP的值
jmp 段地址:偏移地址 同时修改CS:IP的内容
jmp ax 只修改IP中的内容
9. 任意时刻, CPU都把CS:IP指向的内容当作指令执行
8086CPU的工作过程:
a. 从CS:IP中指向的内存单元中读取指令, 读取的指令进入指令缓冲器
b. IP指向下一条指令
c. 执行指令
d. 重复a, b, c步骤
总结: 自己感觉, 第一章的学习是那么的新鲜和好奇, 而从第二章开始就慢慢的进入了枯燥的过程, 同时也让自己对计算机有了一个崭新的认识, 以前在用C语言或者Java的时候, 只是停在会用的阶段, 你知道再多的函数或者方法也都是只知其表, 而不知其根, 在慢慢的接触Assembly后, 自己对高级语言有了一个更深层次的认识, 知道了他们的运行过程, 知道了代码为什么这么写才是优化, 知道了怎样才能写出更优化的代码.
自己一直都在坚持:
没有最简化的代码, 只有更简化的代码.
没有最优化的代码, 只有更优化的代码.
标签:
原文地址:http://www.cnblogs.com/ZeroHour/p/4498325.html