汇编语言 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事专门申请虚拟内存与物理内存的. 有私有内存跟共享内存 ...
随机推荐
- ABP框架和NET CORE实战
http://www.fishpro.com.cn/2017/09/ ABP实战系列 ABP实战 ABP-第一个Asp.net core 示例(7)AutoMapper的使用 我们为什么需要使用DDD ...
- 077 Combinations 组合
给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合.例如,如果 n = 4 和 k = 2,组合如下:[ [2,4], [3,4], [2,3], [1,2], [ ...
- Spark Mllib里如何建立密集向量和稀疏向量(图文详解)
不多说,直接上干货! 具体,见 Spark Mllib机器学习实战的第4章 Mllib基本数据类型和Mllib数理统计
- Java字节码分析
目录 Java字节码分析 查看字节码详细内容 javap 实例分析 Java字节码分析 对于源码的效率,但从源码来看有时无法分析出准确的结果,因为不同的编译器版本可能会将相同的源码编译成不同的字节码, ...
- java的三大特性之一继承概述
0.继承-----注意事项 00.子类最多只能继承一个父类(指直接继承) 01.java所有的类都是Object的子类 02.JPK6.0中有202个包3777个类,接口,异常,枚举,注释和错误 03 ...
- HTML5 JSDOM
1,HTML5 新语义化标签 - nav -- 表示导航 - header -- 表示页眉 -- 头部 - section -- 表示区块 -- 类似于div - main -- 文档主要内容 - a ...
- session会话
jsp会话篇session: package com.log; import java.io.IOException; import java.util.ArrayList; import java. ...
- [拾零]C语言的数组指针
为了强化记忆,从而写笔记保留. 数组指针,顾名思义,是在说一个指针,这个指针是指向数组的. 区别于指针数组 int* p[5] = NULL; //指针数组 基类型 int* int (*p)[5] ...
- 给VS2008 打补丁
vs2003到2008各版本如下: vs.net2003 Visual Studio .NET 2003 Enterprise Architect Visual Studio .NET 2003 En ...
- python基础教程总结8——特殊方法,属性,迭代器,生成器,八皇后问题
1. 重写一般方法和特殊的构造方法 1.1 如果一个方法在B类的一个实例中被调用(或一个属性被访问),但在B类中没有找到该方法,那么会去它的超类A里面找. class A: ... def hello ...