使用书籍《x86汇编语言:从实模式到保护模式》
学习笔记
前言部分
尽管汇编语言不适合用来编写大型程序,但它对于理解计算机原理很有帮助,
特别是处理器的工作原理和运行机制。就算是为了这个目的,也应该让汇编语言回归它的本位,
那就是访问和控制硬件(包括处理器),而不仅仅是编写程序,
输入几个数字,找出正数有几个、负数有几个,大于30的有几个。
事实上,汇编语言对学习和理解高级语言,比如C语言,也有极大的帮助。
直接访问硬件,发挥汇编语言的长处,才能深刻体会到汇编语言的妙处。
第1章 计数法
- 学习汇编语言,要能够在二进制(Binary)、十进制(Decimal)、十六进制(Hexadecimal)这三种进制之间熟练地进行转换
[进制转换] 十进制 二进制 十六进制 8421码
https://www.jianshu.com/p/e2c4943eb945
-
使用 Windows 自带计算器进行多种进制计算
windows 自带计算器,菜单-查看-程序.PNG
使用 Windows 自带计算器进行多种进制计算.PNG
- 在线进制转换计算工具
octave-online.net
输入十六进制 0xF
十进制转十六进制 dec2hex(0xF)
octave-online.net 十进制转十六进制 dec2hex(0xF)
第2章 处理器、内存和指令
概念
- 处理器(processer)
以自己的生活经验来尽力理解这些名词,做了下面的类比:
INTEL 8086
Sony PlayStation 2/3/4
INTEL x86 处理器家族
Sony PlayStation 系列
- 引脚(pin): 可以接受从外面来的信号,或者向外发出电信号
复用:可以重复使用的引脚
- 寄存器(register):本质是电路
双向器件,可以在一端接受输入并加以锁存,同时,它也会在另一端产生一模一样的输出
寄存器可以保存 4比特、8比特、16比特的数据
分别被叫做 4位、8位、16位寄存器
现在的寄存器,一般都是32位、64位甚至更多
(字节)1 Byte = 8 bit
(字)1 word = 16 bit
(双字)1 double word = 32 bit
字节
|7 6 5 4 3 2 1 0|
字
|高字节 |低字节 |
双字
|高字 |低字 |
- 算术逻辑部件(ALU,arithmetic logic unit):专门负责运算的电路
加 减 乘 除 逻辑运算
- 存储器(storage、memory):本质也是电路
内存条
内存储器或主存储器
内存或主存
《x86汇编语言:从实模式到保护模式》 内存和内存访问示意图
《x86汇编语言:从实模式到保护模式》 第13页
- 指令(instruction):本质是数
机器指令,是集中放在内存里的,一条接着一条;
处理器的工作就是自动按照顺序取出并加以执行。
- 低端字节序(little endian)
对于Intel处理器来说,如果访问内存中的一个字,高字节位于高地址部分,低字节位于低地址部分
- 立即数(immediate operand)
指令执行和操作的对象是数时,
如果这个数已经在指令中给出了,不需要再次访问内存,那么这个数就是立即数;
相反,如果指令中给出的是地址,真正的数还需要用这个地址访问内存才能得到,那么它就不能称为立即数。
- Intel 8086 处理器
Intel 8086 处理器 是 intel 公式第一款16位处理器,诞生于1978年(距今整整40年前);
是整个 Intel 32位架构处理器(IA-32)的开山鼻祖。
- 段:代码段与数据段
完成某个工作的所有指令,必须集中在一起,处于内存的某个位置,形成一个段,叫做代码段;
程序要操作大量的数据,这些数据应该集中在一起,位于内存中的某个地方,形成一个段,叫做数据段。
- 物理地址:真实的内存地址
在编写程序时,只能使用相对地主或者逻辑地址,而不能使用真实的物理地址
- 逻辑地址:
段地址:偏移地址
《x86汇编语言:从实模式到保护模式》8086处理器内部组成框图.png
《x86汇编语言:从实模式到保护模式》 第22页
代码段寄存器 code segment CS
数据段寄存器 data segment DS
附加段寄存器 extra segment ES
指令指针 instruction pointer IP
CS 指向代码段的起始地址
IP 指向段内偏移
CS与IP 共同形成逻辑地址,并由总线接口部分变换成物理地址来取得指令
- 段的个数、段的长度 与 内存大小 计算
段的个数 x 段的长度 = 内存大小
内存按字节Byte来组织,一个内存单元存一个字节
1MB 的内存 = 1M 个内存单元 = 2^10K 个内存单元 = 2^20 个内存单元
------------------------------------------------------------------------------
2^16 x 2^4 = 2^20
段数 单个段长度 内存大小
单个段长度是 2^4 = 16 个字节
偏移地址从 0000~000FH
------------------------------------------------------------------------------
2^4 x 2^16 = 2^20
段数 单个段长度 内存大小
段数 = 2^4 = 16 段
段地址
0000H
1000H
2000H
...
F000H
------------------------------------------------------------------------------
Intel 8086 的段寄存器和IP寄存器都是16位的,
16位的物理地址只能访问 64KB(2^16 Byte = 2^6 KB = 64 KB)的内存,
地址范围是 0000~FFFFH,共65536个字节。
偏移地址要求从 0000H 开始,8086处理器的逻辑分段,起始地址都是16的倍数,称为按16字节对齐。
段地址 如果是 DS = 8226H
段的长度最长可以是 64KB
对应的逻辑地址范围是 8226H:0000H ~ 8226H:FFFFH
转换成物理地址范围是 82260H ~ 9225FH
dec2hex(0x82260+0xFFFF) ans = 9225F
