汇编语言 Part 1——简介、基本语法、内存分段与内存地址
简介
什么是汇编语言?
汇编语言是一种低级的编程语言,在程序的语句和体系结构的机器代码指令之间有很强的对应关系。
每种汇编语言都特定于特定的计算机体系结构,但需要解释或编译。汇编语言也可以称为符号机器代码。
汇编语言通常每个机器指令都有一个语句,通常也支持汇编指令、程序和内存位置的宏和符号标签。
汇编代码被汇编器转换为可执行的机器代码。转换过程称为汇编。
计算机编程语言的演进
机器语言
与模拟和机电计算机的早期工作不涉及我们所了解编程语言。由于早期的计算机需要直接对每个问题集进行连线,所以设置插头的过程取代了基于文本的算法蒸馏。
随着汞延迟线和磁鼓记忆装置取代机电设备,在无需重新布线的情况下直接写入内存中的地址并提供指令变得更加容易。这通常指的是编写我们称之为 "机器代码 "的内容。现在通常被称为"十六进制",因为现代的32位和64位微处理器系统以8或16十六进制块每时钟周期的速度读取二进制数据。
在计算机级别编写代码是困难的:它要求程序员知道在硬件中寄存器和处理器的指令集的特定位置。阅读机器代码通常比编写它更困难,因此跟踪代码更改几乎是不可能的。
汇编语言
汇编语言的出现意味着第一次升级到计算机代码级别的编程。他提供了一种用字符串操纵符和名称来编写机器代码的方法,而不是原始的二进制版本。它仍然是难以阅读,仍然需要知道哪些指令和寄存器位置,但它可以在纸或屏幕上阅读并汇编成机器代码。
我们还在使用汇编,大多数计算机外设的设备驱动程序都是用C代码编写的,但有些实时故障最好通过手动优化C编译器中途生成的汇编代码来解决。
高级语言——FORTRAN
FORTRAN 代表了公式翻译 (FORmula TRANslation)。这门语言是在上世纪50年代中期的IBM 704系列计算机上发明的。
高级语言——BASIC
在计算机编程中,BASIC (Beginner's All-purpose Symbolic Instruction Code) 是一个高级语言族。它最初于 1963年由Dartmouth College的John George Kemeny和Thomas Eugene Kurtz设计,使得非科学领域的学生接触到了计算机。当时所有的电脑使用需要编写自定义软件,这是只有科学家和数学家倾向于做的事情。二十世纪八十年代,它在家用微型计算机上变得普遍,现在在少数大幅演变的语言中仍然流行。
高级语言——COBOL
COBOL (COmmon Business Oriented Language) 是一个上世纪60年代出现的高级编程语言,并仍然用于业务应用。它广泛应用于金融服务行业使用的基于大型机的应用。它使用类似英语语句的指令,并为程序设定了一个整体框架。COBOL 的设计目标是一种自文档化的语言,可以方便地对其进行修改和维护。
高级语言——PL/1
Programming Language 1 是为科学、工程和业务应用程序设计的高级编程语言。它是最具特色的编程语言之一,也是最具功能丰富的一类中的第一个。它自上世纪60年代代初推出以来,已被各种学术、商业和工业用户使用,至今仍在积极使用。它支持递归和结构化编程。语言语法是类似于英语的,适合描述复杂的数据格式,有一组广泛的可用于验证和操作的函数。
汇编语言的优点
了解汇编语言使人知道——
- 程序是如何与操作系统 (OS)、处理器和BIOS交互的;
- 数据是如何在内存和其他外部设备中表示的;
- 处理器是如何访问和执行指令的;
- 指令是如何访问和处理数据的;
- 程序是如何访问外部设备的。
使用汇编语言的其他优点是——
- 它需要较少的内存和执行时间;
- 它以更简单的方式允许特定于硬件的复杂工作;
- 它适用于追求效率的工作;
- 它最适合编写中断服务例程和其他内存驻留程序。
个人计算机硬件的基本特点
PC 的主要内部硬件由处理器、内存和寄存器组成。寄存器是保存数据和地址的处理器组件。在执行程序时,系统会将其从外部设备复制到内部内存中。处理器执行程序指令。
计算机存储的基本单元是位 (bit);它可以 ON (1),也可以是 OFF (0)。一组九个相关位组成一个字节,其中八位用于数据,最后一个用于奇偶校验。根据奇偶校验规则,每个是ON (1) 字节上的位数应该总是奇数。
因此,奇偶校验位的应用使由比特组成的字节数是奇数。如果奇偶校验是偶数,系统假定出现了奇偶校验错误 (尽管很少见),这可能是由于硬件故障或电气干扰造成的。
处理器支持以下数据大小——
- 字(Word): 2 字节数据项
- 双字(Doubleword): 4 字节(32位)数据项
- 四字(Quadword): 8 字节(64位)数据项
- 段落(Paragraph): 16 字节(128位)数据项
- 千字节(Kilobyte): 1024 字节
- 兆字节(Megabyte): 1,048,576 字节
在内存中寻址数据
处理器控制指令执行的过程被称为回迁—解码—执行 (fetch-decode-execute) 周期或执行周期 (execution cycle)。它包括三连续的步——
- 从内存中获取指令
- 解码或识别指令
- 执行指令
处理器一次可以访问一个或多个字节的内存。让我们考虑一个十六进制数字0725H。此数字将需要两个字节的内存。高阶字节或最有效字节为 07,低阶字节为25。
处理器以反向字节序列存储数据,即低序字节存储在低内存地址和高内存地址中的高阶字节中。因此,如果处理器将值0725H从寄存器带到内存,它将首先将25传输到较低的内存地址,然后将07转换为下一个内存地址。
x: 内存地址
当处理器将内存中获取数字数据送往寄存器时,它再次反转字节。有两种内存地址——
- 绝对地址 (Absolute address) ——特定位置的直接引用。
- 段地址 (或偏移量) (Segment address (or offset)) ——具有偏移值的内存段的起始地址。
基本语法
汇编程序可分为三部分——
- 数据 (data) 部分,
- bss (Block Started by Symbol) 部分,以及
- 文本 (text) 部分。
数据 (data) 部分
数据 (data) 用于声明初始化的数据或常量。此数据在运行时不会更改。可以在本节中声明各种常量值、文件名或缓冲区大小等。
声明数据的语法是——
section.data
bss 部分
bss 用于声明变量。声明 bss 的语法是——
section.bss
文本 (text) 部分
文本 (text) 用于保留实际代码。本部分必须以声明 global _start
开始,它告诉内核程序执行的开始位置。
声明文本的语法为——
section.text
global _start
_start:
注释
汇编语言注释以分号 (
汇编语言 Part 1——简介、基本语法、内存分段与内存地址的更多相关文章
- C++继承体系中的内存分段
---------------综述与目录-------------- 讨论这个问题之前我们先明确类的结构,一个类的大概组成,下面的很多分类名词都是我个人杜撰,为的就是让读者看懂能够区分,下面分别分类: ...
- (转)从内存管 理、内存泄漏、内存回收探讨C++内存管理
http://www.cr173.com/html/18898_all.html 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟 ...
- JVM基础知识(1)-JVM内存区域与内存溢出
JVM基础知识(1)-JVM内存区域与内存溢出 0. 目录 什么是JVM 运行时数据区域 HotSpot虚拟机对象探秘 OutOfMemoryError异常 1. 什么是JVM 1.1. 什么是JVM ...
- JVM并发机制的探讨——内存模型、内存可见性和指令重排序
并发本来就是个有意思的问题,尤其是现在又流行这么一句话:“高帅富加机器,穷矮搓搞优化”. 从这句话可以看到,无论是高帅富还是穷矮搓都需要深入理解并发编程,高帅富加多了机器,需要协调多台机器或者多个CP ...
- c语言学习之基础知识点介绍(十):内存空间模型、地址解释及指针变量
一.内存 /* 内存: 存在内存里的. 内存分了N多个小空间,每个小空间1个字节 每个小空间有它自己的地址.每个地址之间差1 int类型占用4个字节,等于占了4个空间(有4个地址),不需要记住4个地址 ...
- [内存管理]连续内存分配器(CMA)概述
作者:Younger Liu, 本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 未本地化版本许可协议进行许可. 原文地址:http://lwn.net/Articles/396657/ 1 ...
- iOS的内存分析和内存管理
iOS的内存分析和内存管理 [内存管理]一直是iOS开发中的一个重点. 本文就带你从内存分析开始一步步了解内存的占用情况,从真实的情况中领悟真正项目开发过程中的内存的使用情况. 注:本文默认你熟悉 M ...
- alloc_page分配内存空间--Linux内存管理(十七)
1 前景回顾 在内核初始化完成之后, 内存管理的责任就由伙伴系统来承担. 伙伴系统基于一种相对简单然而令人吃惊的强大算法. Linux内核使用二进制伙伴算法来管理和分配物理内存页面, 该算法由Know ...
- Win3内存管理之私有内存跟共享内存的申请与释放
Win3内存管理之私有内存跟共享内存的申请与释放 一丶内存简介私有内存申请 通过上一篇文章.我们理解了虚拟内存与物理内存的区别. 那么我们有API事专门申请虚拟内存与物理内存的. 有私有内存跟共享内存 ...
随机推荐
- Netty(5)@Sharable
问题:我写了MyDecoder which extends ByteToMessageDecoder,单线程没问题,但是多线程时,报'the handler should be sharable'.查 ...
- FusionCharts图表控件中文版使用手册
三要素:swf.data.xml.承载图表的载体 1.Swf: 按照你所设计的图表类型加载相应的.swf文件到你的工程即可(eg:若你想生成一张二维柱状图,那么在你的工程里就必须包含Column2D. ...
- Spark Mllib里如何程序输出数据集的条数(图文详解)
不多说,直接上干货! 具体,见 Hadoop+Spark大数据巨量分析与机器学习整合开发实战的第17章 决策树多元分类UCI Covertype数据集
- linux下火狐浏览器安装flash player插件
1 去官方网站下载flash player 安装包.后缀名为.tar.gz,假设名称为flash.tar.gz 默认在桌面 2 下载后解压缩,使用以下命令 #tar -zxvf /root/Deskt ...
- Java的常量接口思考,项目中的常量是放在接口里还是放在类里呢?
最近在看一本书 Java与模式,里面提了一句不建议使用常量接口,甚至举了个java源码的反例, 蛋疼的是没有说为什么? 查了网上一圈发现他们也是知道怎么做而不知道为什么这么做. 然后我只能找谷歌了,翻 ...
- Redis特性之持久化机制
持久化机制 Redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到硬盘来保证持久化. Redis支持两种持久化方式: 1.snapshotting(快照)也是默认方式 ...
- 【持续更新】Spring相关
什么是IoC 什么是AoP Bean的实例化方法--3种 Bean的作用域--常用2种 Bean的生命周期 Bean的装配方式 基于xml的2种装配方式 基于Annotaton的装配方式
- 'gets' undeclared here (not in a function)
原文:http://www.cnblogs.com/hjj801006/p/3988220.html 1.在命令行输入:find -name stdio.in.h.查到有两个文件中含有stdio.in ...
- CAS 配置NLB 负载均衡网络无法连接
在虚拟机与虚拟机.虚拟机与实机之间利用Windows操作系统自带的网络负载均衡功能如选择单播集群模式,网络就无法通讯,NLB不成功. Scenario #1 在虚拟机与虚拟机之间选择多播模式NLB可正 ...
- HDU 5452 Minimum Cut (Spaning Tree)
生成树的上的一个非根结点对应一条生成树上的边,然后这个结点的子树上连出去的边就对应去掉这条边的割, 然后就可以对树外的边求LCA,在LCA上标记,利用这个信息可以算出有多少条边在子树上,以及有多少条边 ...