因为大学的时候学习汇编语言,那时候喜欢了本战争的书(王树增的),很用心的看,就没咋学,但是又一直觉得汇编语言及其伟大,感觉汇编语言的人好牛逼,但是一直也没耐下心去看,大概懂几个指令,但是觉得没什么意义,所以决定重新学习一遍,才能释怀,否则心里嘎嘎难受!
不扯了,首先了解一下必要的概念。
寄存器组,逻辑地址,物理地址,内存单元。
目录
1,寄存器组
16bit: 4+4+2+2+1+1 = 14个(每个都是16位)
4个数据寄存器:AX, BX, CX, DX; 4个段寄存器:ES, CS, SS, DS;
2个变址和指针寄存器:SI, DI; 2个指针寄存器:SP, BP;
1个指令指针寄存器:IP; 1个标志寄存器:Flags;
32bit: 4+6+2+2+1+1 = 16个
4个数据寄存器:eax, ebx, ecx, edx; 6个段寄存器:es, cs, ss, ds, fs, gs; #多了两个卡楞子寄存器
2个变址和指针寄存器:esi, edi; 2个指针寄存器:esp, ebp;
1个指令指针寄存器: eip; 1个标志寄存器: eflags;
2,通用寄存器的作用:
必须牢记,才能运用自如啊,走马观花的看一遍就过了的,后面一定会重返工。
3,物理地址
16bit的系统有20根地址线,20根地址线编码是1M,16bit编码范围是64k,所以采用分段方法管理,段地址每一段形式都是
xxxx0h,(其实我觉得这句话很难理解,既然段地址都是xxxx0h了,还乘16干什么?又要左移4位么?可能是把结论写出来了。所以这个教程里这么写有点混淆,而在王爽版本的教科书里,则是很明确的指出两根地址线,每个16位,举得例子里,访问123C8h的地址,是1230h(段地址)*16 + 00c8h = 123C8h,书中特意就下面的公式进行了讲解,总之理解就好,每个人都有自己的理解)
然后通过偏移来找到具体位置。也就是用2根16位的寄存器来访问1M的内存空间,一个称为段地址,一个称为偏移地址。
即 “物理地址 = 段地址 x 16 + 偏移量”
PA 也叫基础地址 也叫有效地址(EA)
一个物理地址可有多个逻辑地址,毕竟两个都是变量么。
4,16位段寄存器的引用
段、段、段、段、 4个段寄存器,重要。
深刻理解并牢记每个寄存器间的关系。
1)取指令的段寄存器和偏移量一定是CS和IP;
2)堆栈操作所用的段寄存器和偏移量一定是SS和SP;
3)串操作的目标操作数所用的段寄存器和偏移量一定是ES和DI;
其他,除了默认引用的寄存器,还可以强行改变为其他寄存器。
***** 一共5种模式,3个是定格的。
5,存储单元的内容
大端小端的问题。以及字节,字的表示方法。牢记“高高低低”原则。
6,32位的内存管理模式
提供了两种不同的工作方式:实模式和保护模式。
实模式:32位与16位的内存管理是一致的。
保护模式:段地址可以长达32位,其值可以不是16的倍数,每个段的最大容量可达4G。段寄存器的值是表示段地址的“选择器”(Selector),用该“选择器”可从内存中得到一个32位的段地址,存储单元的物理地址就是该段地址加上段内偏移量,这与16位微机的物理地址计算完全不同。(我觉得越是不经意的,越是要理解)