读笔_汇编语言-基于Linux环境(第4章-位置_寄存器_内存寻址以及了解数据存储位置I)

文章也同时在简书更新

引言

本章节着重阐述x86的内存寻址机制,理解内存寻址是一项艰苦的过程,但是一旦掌握其中的精髓,将会收获一生受用(程序员生涯)的技能,这是令人激动的。

我在本科以及考研期间,都有系统地学习过《微型计算机原理与接口技术》,其中涉及到汇编的部分详细地讲解了内存寻址,因此这一次在本书中再次看到这方面的知识,是怀着一种怀旧和重温的心境的。本以为之前已经学得不错了,这次再读,果然如作者所说,会有新的知识 GET DA☆ZE!!!

作为一名从计算机专业科班出身的人来说,将来不管是做什么,可能都或多或少无法割离编程了,甚至可以说编程的影响已经深入我的生活中,它是一种思维方式。而计算机也几乎是我们谋生的首选技能,当然一味地以金钱和收入来衡量计算机专业的价值是对这门科学的不尊重。大家可以看到现在软件行业门槛低,收入高,非常多的人趋之若鹜,大多是以追求高收入为首要目标,真正从心底热爱它,撇去名利地想去钻研它的人还是非常少的。这里我不会去评价这种现象,它存在必然有它的合理性。但不管我们是以何种动机踏入计算机科学的领域,我们都希望在这方面做得出色,至少能够做一名优秀的程序员

想做到这一点,需要我们付出艰苦的努力,我现在越来越感受到基础知识的重要性,有一个好的计算机专业基础,将会极大提高我们学习新知识的能力。而在基础知识中,我认为底层方面计算机的基本原理是非常重要的,这也是为什么我会在互联网时代还会去学一门不少人嗤之以鼻的汇编语言。本身我业余兴趣是做iOS,iOS做到后来需要强力的C语言支持,而C语言又会牵扯出更多底层的知识:Linux,数据结构,计算机网络,操作系统,算法等等。恰恰这也是各大一流企业所看重的基本技能。所以,如果你想成为一个优秀的程序员,可能就需要在这些方面花点精力进行提高了。当然,学习的知识有很多,不局限与我所说的,如果你有兴趣和我一起学习计算机底层的知识,那将是我的荣幸,非常欢迎你的加入!

我们开始吧!

摘录

以下皆基于intel x86 CPU的架构。

  • 内存寻址有三种模式:1. 实模式平面模型(real model flat model); 2. 实模式段模型(real model segmented model); 3. 保护模式平面模型(protected mode flat model);
  • 内存系统中的地址线根数和存在在每个位置上的数据的位数之间没有必然的关系。如16根地址线可以寻址64K字节,但在每个位置可以存在8位位二进制数,也能同样存在16位或者32位数据。
  • 距离内存底部256字节的地址为0100H,这前256个字节叫程序段前缀PSP(Program Segment Prefix),里面包含各种零碎消息和一个用于程序磁盘输入输出的通用内存缓冲区。
  • 兆字节本质:一个1M字节的内存,由包含20根电线的地址总线连接的,计算机内部的一些内存芯片组合。通过向那20根地址线提供20位地址来标识1MB中的一个字节。
  • 现代CPU利用某技术把自己暂时变成一个8086,这叫虚拟86模式(virtual-86 mode)。
  • 在实模式分段模型中,段是一个内存区域,它从一个段落(paragraph)边界开始,并扩展到一定数量的字节。在实模式分段模型中,这个数量小于或等于64K(65536)。因此,任何能被16整除的内存地址都被称为一个段落边界(paragraph boudary)。
  • 因为一个段可能开始于任何一个段落,所以把段开始的那个段落边界的编号叫做该段的段地址
  • 实模式1M内存中,段落大小:16字节;段落编号:0~0FFFFH,共65536个;一个段大小:2的16次方,64KB。最高的段地址为0FFFFH(对应内存地址0FFF0H),它距离实模式1MB内存最顶部(对应内存地址0FFFFFH)16个字节。
  • 段可以开始于任意段地址,共有65536个段地址均匀地分布在实模式下满满1MB内存中,每两个段地址之间相隔16字节。一个段最大可达64KB,但并不一定非要那么大。此外,段也是可以重叠的。
  • 实模式段模型中,20位内存地址需要放到16位的寄存器中,这就需要2个寄存器来工作。通过[段地址: 偏移地址]的方式来进行。
  • 用两个16位寄存器表示一个20位地址,就是把段地址放入一个16位寄存器,把偏移地址放入另一个16位寄存器。两个寄存器一起,共同标识实模式1MB内存中1048576(2的20次方)个字节中的一个。

感想

读懂了寻址也就读懂了汇编。

周鶏🐣(Kimiko) wechat
拿起手机扫一扫,欢迎关注我的个人微信公众号:「洛斯里克的大书库」。
坚持原创技术分享,您的支持将鼓励我继续创作!