汇编语言 第1章 基础知识

隐藏

前言

从CSAPP跳到《汇编语言》主要是因为进入第三章前先预热一下,毕竟CSAPP内容太丰富,以至于可能一段都是一个值得深思的问题。而王爽老师的作品《汇编语言》则浅显易懂、循序渐进,看的比较快,很轻松,也学到不少东西,记录下来。

汇编语言不对硬件系统进行深入研究, 关于PC机及CPU物理结果和编程结构的全面研究,参考《微机原理与接口》 关于计算机一般的结构、功能和性能的理论方面研究,参考《组成原理》 汇编语言重点研究如何利用硬件系统的编程结构和指令集控制系统工作。

《汇编语言》中有试验,然而手头上可能没有相应的硬件和系统,毕竟8086还是有些古老,可以通过软件DOS-box模拟环境,并载入相应程序debug、masm、link。

环境搭建步骤网上很多,此处略。 需要说明的是debug程序最好直接拷贝于win32系统自带的debug程序(C:\system32\debug.exe),否则有bug。

比较麻烦的是每次重新进入DOS-box都要mount,且没有历史命令选择, 而且指令的二进制机器码不完全一致。

机器语言

机器语言无论过去的打孔式还是高低电平式,都是二进制。

汇编语言的产生

机器语言是二进制,不仅不方便阅读,还容易出错,于是用便于书写记忆的文本指令代替,即汇编语言。

然后通过编译器将汇编语言转换成机器能懂的机器语言。

存储器

机器执行的指令和数据需要在存储器中存放,即内存,我们首先要了解CPU如何从内存中读取数据,以及思想内存中写入信息。

指令和数据

在内存和磁盘上,指令和数据都是二进制的机器码,一段机器码说不定既可以看出指令,也可以看出数据。根本看不出区别。

从第三章节将了解到,区分指令和数据的是通过专门查找指令地址的CS:IP寄存器, 以及查看数据的DS:[x]寄存器(x为偏移量)。

存储单元

编号从0开始,一个存储单元即一个Byte。

CPU对存储器的读写

CPU要想进行数据的读写,必须提供3类信息交互:

  • 存储单元的地址(地址信息
  • 器件选择,读取或者写入命令(控制信息
  • 读取或者写入的数据(数据信息

CPU通过总线与外部连接,因为有3类信息, 因此总线从逻辑上也分为3类:地址总线控制总线数据总线。 我们看到的CPU与外部交换的总线就在CPU针脚上。

1) 地址总线

CPU通过地址总线来指定存储单元,那么地址总线越多,则存储单元数量越多,即内存越大。

例如32根地址总线有2^32个存储单元,即4GB。 (很好算,2^10对应1024即K,那么2^30对应K-M-G,GB,再多2位,即4,所以是4GB) 这也是常说的32位系统理论上内存最大为4GB。

2) 数据总线

CPU与内存或者其他器件的数据传送通过数据总线进行。

数据总线宽度决定了一次可传送的数据量, 例如对于16位数,8根线要传送2次,16根线只需要1次。

3) 控制总线

CPU对外部器件的控制通过控制总线进行,这里控制总线是一个总称。 控制总线是一些不同控制线的集合。 有多少根控制总线,就意味着CPU对外有多少种控制。 例如一根称为“读信号输出”控制线负责CPU向外传送数据; 一根“写信号输出”控制线负责传送写信号。

内存地址空间

主板

接口卡

各类存储器芯片

一台PC上有多种存储芯片,包括: RAM(主存储器) ROM(装有系统BIOS) 扩展槽上的RAM(内存条) 扩展槽上的显卡上的RAM(显存)及ROM(装有显卡BIOS) 扩展槽上的网卡上的ROM(网卡的BIOS) 等等。

内存地址空间

在CSAPP中也成为虚拟地址空间,即虽然上述ROM、RAM的物理地址是相互独立的, 但是CPU看到的虚拟地址是连续的

通常从编号0的地址开始一段映射到主存储器地址空间(包括主存储器和扩展内存卡)。 接着是显存地址空间。 再往上是显卡\网卡\系统的BIOS的ROM地址空间

我们在基于一个计算机硬件系统编程的时候,必须知道其内存地址空间的分配情况

-----EOF-----

Categories: 汇编 Tags: 汇编 底层