首页 > 其他 > 详细

汇编学习笔记

时间:2019-07-07 13:06:26      阅读:87      评论:0      收藏:0      [点我收藏+]

汇编语言是为了解决早期机器指令过于复杂难记发明的,本质就是使用一些特殊字母代替机器指令,运行前由编译器翻译为机器指令。所以的汇编是最接近机器语言的语言,它可以面向硬件编程,我们使用高级语言,如 c,c++,java到最后都必须转为汇编。通常情况下我们并不会使用汇编编程,因为它太复杂,很难进行大型项目编写,而且汇编基本都是针对硬件编程,完全不可移植。但是学习汇编却也是必要的,它可以大大提升我们对计算机、对操作系统、对其他语言的理解。我就是因为想要森如学习操作系统才开始学习汇编,以下是简要的学习笔记(学习笔记而不是教程,只是一些总结归纳,不能当做教程,甚至可能只有本人能看懂,请做好心理准备)。 

汇编的学习资料不是很丰富,但是好书也还是不少的,这里推荐王爽老师的《汇编语言》,内容详略有度通俗易懂,我的学习基本就是基于这本书,此外再推荐一个网站 http://c.biancheng.net/asm/ ,王爽老师的书侧重原理,此网站侧重用法,请结合使用

 

学习环境准备

  因为早期的书都是基于windows系统,所以如果在windows系统上学习汇编就方便的很多,本人因为某些原因装的是linux 系统,与书本上的环境对不上,所以环境准备就多了一个门槛。linux上当然也是可以直接编写汇编的,但是其语法规则和windows上差别很大,十分诡异,而且和书本对应不上,而且我本质不是为了深入研究汇编,所以不想过多研究不同的环境,就在linux上搭建了一个dos环境,如果有人和我一样,请往下看

  linux上运行.exe程序基本都是基于虚拟机,wine ,freedos,dosemu等等,但是并不是所有的虚拟机都适合学习汇编,这里推荐dosbox,学习汇编因为要使用到debug.exe,dosbox对这个调试工具的支持很好,而且它十分小巧,也是同类型运行速度最快的虚拟机。美中不足是界面太丑了,分辨率不可调(我的电脑不可调整)。如果对此不介意的话dosbox是首选,如果你是强迫症患者,可以搜索其他的方式(dosemu基本不用考虑,它好像不能运行debug.exe我查了很久也没找到原因),如果有其他更好的方式可以告诉我。

  学习汇编最基本的需要使用到三个工具,汇编器,链接器,调试工具,这三个工具在的windows 和linux上都有,也有跨平台的,因为我的学习是基于dos 的,所以我的使用的分别是masm.exe \ link.exe \ debug.exe 

 

计算机基本知识

1、计算机基本组成

1)计算机有存储器 | 运算器 | 控制器| 输入设备 |输出设备 五部分组成
2)计算机的五部分是概念分类,实际的物理设备有很多,比如输入设备就有键盘和鼠标,存储设备有磁盘、内存、寄存器等等,这些物理设别互相配合使计算机能完成复杂的任务。既然需要配合,部件之间就必须要进行通信,计算机的所有部件之间的通信斗依赖总线
3)总线是计算机的一个概念,实际上就是一个集成电路。计算机的所有部件都连接在一个集成电路上,互相之间可以通过集成电路传递信息
4)计算机之间并不是随意的通信,随意的配合,而是需要有人调度,这个调度者就是CPU

 2、CPU基本知识 

1)CPU是计算机的核心, 负责数据的运算和计算机的控制。显然CPU不是一个单一的设备,构成CPU的主要有三个部件:控制器、运算器和寄存器。
2)控制器是负责计算机资源调度的,比如数据的读写,网络请求的收发。当cpu收到一个指令后,控制器就通过总线将指令发送给相关的部件
3)计算机的总线分为三种
 *地址总线:主要负责内存的寻址,每个cpu都存在多个内存总线,每个总线都只能传递0或者1,那么地址总线的组合就可以传递一个二进制码, 如果一个cpu存在n个地址总线,它最多能访问2^n方个地址码,那此计算机的最大可用内存也就只能是 2^n 字节。可使用内存的大小受此限制
 *数据总线:负责cpu和其他组件的数据传递,原理和地址总线一样,如果数据总线个数为8,每次就能传递1字节数据
 *控制总线:负责cpu对其他组件的控制,控制总线是一系列总线的统称,cpu有很多控制总线,每个控制总线斗代表一种基础控制指令,比如读数据、写数据,指令的组合使用可以完成一些复杂控制
4)CPU的运算器负责数据的运算,既然要运算数据就必须有数据的来源和结果的存储位置,这就是寄存器的作用,作为cpu计算的数据来源和结果的存储位置.当然寄存器的作用远不止如此
5)每个CPU 都包含多个寄存器,每个寄存器各有作用,有的作为cpu运算数据来源,有的保存指令的存储位置,而且每个cpu的寄存器数量和分类都不同,这里以8086cpu 介绍

3、存储器基本知识

1)存储器是一个统称,磁盘、内存、寄存器都是存储器,这里主要介绍内存
2)CPU进行数据计算的直接数据来源是寄存器,而寄存器的数据来源是内存了。cpu需要计算时就将数读取到寄存器,然后从寄存器再获取到数据进真正的计算。
3)cpu想要使用数据首先必须要找到数据,内存就好象存储数据的小房间,每个房间都有一个独一无二的门牌号,这个门牌号就是内存的物理地址。cpu要进行数据读写就必须给内存提供一个物理地址,告诉内存需要哪块数据或者数据要存储在哪块内存,这就是寻址。
4)cpu从内存读写数据分为三步 (以数据读取举例)向内存发出一个内存区编号 > 发出指令告知内存需要读取这个编号的内容 > 内存将数据发送给cpu
5)内存其实也是多种存储器的统称,这些存储器包括主存储器,RAM存储器,ROM存储器,显卡存储器,网卡存储器等等,这些存储器都是独立的设备,但是它们都和总线相连,于是CPU在逻辑上把它们当作一个内存,用地址空间加以区分,每个存储器占用特殊的一段地址空间

4、段和栈

1)我们在编程时经常会听到数据段、代码段、堆、栈等概念,这些概念都是方便内存管理的,对于计算机来说并没有这么复杂的概念,cpu只知道存储空间,一些高级的抽象概念只不过是人们为了内存管理方便,把某些区域的内存规定为某类数据的专门存储地。换句话说你可以规定任意内存作为专门存储源代码的地方,这块内存就是代码段
2)计算机中有一个基础的概念,栈。栈是一种数据结构,特点是后进先出,市面上集合所有的cpu都通过某种方式实现了这种数据结构。cpu只有存储空间的概念, 自然不会天然的存在这种复杂的数据结构,栈的本质还是一段存储空间,只不过计算机通过某种方式保证,后进入这段空间的数据先出去,先进入这段空间的数据后出去。只要能实现这个特点,就能说这是一个栈
3)计算机实现栈结构的方式也比较简单,使用一个寄存器保存栈顶的物理地址,在存取数据时更新此寄存器的数据,保证这个寄存器的物理地址时刻指向栈顶,虽然cpu能时刻记录栈顶元素的位置,但是的它并不记录栈的大小, 也就是说你可以一直向栈里面压入元素,就很可能造成栈越界,所以使用栈的时候,栈越界是必须要考虑的

汇编简介

1、汇编语言简单来说就是用一些单词指令代替机器指令,运行时由翻译软件将单词翻译成机器指令,所以每个机器指令在汇编中都有对应的汇编指令,类似获取数据,加减乘除。当然,汇编语言锁含有的指令比机器指令多很多,主要分为三种

1)汇编指令:机器码的助记码,每个有对应的机器码
2)伪指令:用于编译器操作的辅助指令,没有对应机器码
3)符号:基本运算符号,供编译器使用,没有对应机器码

 

寄存器专题

寄存器是学习汇编的核心,在汇编中,程序员能够用指令读写的只有寄存器,并以此实现对cpu的控制。

在学习寄存器之前需要学习两个基本概念:段地址和偏移地址

段地址和偏移地址

cpu的寻址能力是由寄存器的宽度决定,我们常说的16位cpu其实就是指它的寄存器宽度是16位,一个16位宽度的cpu每次寻址最多能找到2^16内存单元。

计算机的内存管理能力是由地址总线数量决定的,一个cpu含有16根地址总线,计算机就可以管理2^16个内存单元

8086CPU 寄存器有16字节,但是cpu的地址总线却有20根,这就造成了一个矛盾,根据地址总线的数量计算,cpu的寻址空间最大为2^20,但是根据寄存器的宽度计算,cpu每次寻址最大只能找到2^16的位置。为了解决这个问题人们发明了段地址和偏移地址的概念。其实概念很简单,既然单个寄存器无法满足寻址要求,那就使用两个寄存器组合好了,我们可以用一个寄存器保存一个基础地址(段地址),用另一个寄存器保存一个补充地址(偏移地址)。两个组合就可以得到一个更大的地址
例子:
问题:用两个三位数AAA,BBB表示一个四位数CCCC(2538)
实现:我们可以约定两个三位数的组合规则是 AAA * 10 + BBB,那么我们就可以把两者组合写作 250 * 10 + 038

基于以上例子的原理得到
物理地址 = 段地址 * 16 + 偏移地址

 

寄存器分类与用途介绍

每种CPU 的寄存器数量和用途都是不同,8086cpu含有14个寄存器 ax | bx | cx | dx | ds | ss | cs | es |  sp | bp | si | di | ip | psw,下面介绍这些寄存器的用途

1、被用来存放一般性数据的寄存器被称为通用寄存器:ax | bx | cx | dx。8086cpu新一代寄存器都是16位的,而上一代寄存器都是8位的,为了向下兼容,这四个16位通用寄存器都可以被分成两个独立的8位寄存器使用,高8位用H表示,低8位用L表示。如AX 可以被分为 AH,AL

2、

 

汇编学习笔记

原文:https://www.cnblogs.com/fanjie/p/11145191.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!