下载APP 编程狮,随时随地学编程
返回 首页

Assembly Language教程

开始阅读
手册说明:

认识 Assembly Language:

Assembly language汇编语言)是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码,用地址符号(Symbol)或标号(Label)代替指令或操作数的地址。在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。普遍地说,特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植。


许多汇编程序为程序开发、汇编控制、辅助调试提供了额外的支持机制。有的汇编语言编程工具经常会提供宏,它们也被称为宏汇编器。汇编语言不像其他大多数的程序设计语言一样被广泛用于程序设计。在今天的实际应用中,它通常被应用在底层,硬件操作和高要求的程序优化的场合。驱动程序、嵌入式操作系统和实时运行程序都需要汇编语言。



Assembly Language 的优点:

①说明程序是如何与操作系统、处理器和BIOS接口的; 


②说明数据是如何表示并存储在存储器与外部设备上的; 


③阐述处理器是如何访问与执行指令的,以及指令是如何访问与处理数据的; 


④阐述程序是如何访问外部设备的。


使用汇编语言的理由是:

能够直接访问与硬件相关的存储器或I/O端口; 

能够不受编译器的限制,对生成的二进制代码进行完全的控制; 

能够对关键代码进行更准确的控制,避免因线程共同访问或者硬件设备共享引起的死锁; 

能够根据特定的应用对代码做最佳的优化,提高运行速度; 

能够最大限度地发挥硬件的功能; 

用汇编语言编写的程序比用高级语言编写的程序所要求的存储空间与执行时间将显著减少; 

汇编语言使程序员可以完成技术性非常强的任务,而使用高级语言,即使可能做到,恐怕也会非常困难; 

虽然大多数软件专家是用高级语言开发新的应用软件的(那样做,程序会比较容易编写的维护),但是对于执行时间要求比较苛刻的部分,常常还要用汇编语言来重新编写; 

常驻程序(当其他程序运行的时候,常驻在存储器中的程序)和中断服务例行程序(处理输入与输出的程序)几乎都是用汇编语言开发的。


Assembly Language 的缺点:

虽然汇编语言有诸多的优点,同时还应该认识到,汇编语言是一种层次非常低的语言,它仅仅高于直接手工编写二进制的机器指令码,因此不可避免地存在一些缺点:

  

编写的代码非常难懂,不好维护; 很容易产生Bug,难于调试; 只能针对特定的体系结构和处理器进行优化; 开发效率很低,时间长且单调。


Assembly Language 的发展及学习前的准备:

早期的程序设计均使用机器语言。程序员们将用0, 1数字编成的程序代码打在纸带或卡片上,1打孔,0不打孔,再将程序通过纸带机或卡片机输入计算机,进行运算。这样的机器语言由纯粹的0和1构成,十分复杂,不方便阅读和修改,也容易产生错误。程序员们很快就发现了使用机器语言带来的麻烦,它们难于辨别和记忆,给整个产业的发展带来了障碍,于是汇编语言产生了。


汇编语言的主体是汇编指令。汇编指令和机器指令的差别在于指令的表示方法上。汇编指令是机器指令便于记忆的书写格式。

操作:寄存器BX的内容送到AX中
 
 
1000100111011000              机器指令
 
 
mov ax,bx                    汇编指令

此后,程序员们就用汇编指令编写源程序。可是,计算机能读懂的只有机器指令,那么如何让计算机执行程序员用汇编指令编写的程序呢?这时,就需要有一个能够将汇编指令转换成机器指令的翻译程序,这样的程序我们称其为编译器。程序员用汇编语言写出源程序,再用汇编编译器将其编译为机器码,由计算机最终执行。


21世纪以来,学习汇编的人虽然也不少,但是真正能学到精通的却不多,它相对于高级语言难学,难用,适用范围小,虽然简单,但是过于灵活,学习过高级语言的人去学习汇编比一开始学汇编的人难得多,但是学过汇编的人学习高级语言却很容易,简从繁易,繁从简难。对于一个全面了解微机原理的程序员,汇编语言是必修语言。


在您开始学习 Assembly Language 之前,您应该对以下知识有基本的了解:


w3cschool《C语言教程


Assembly Language 环境及安装

本地环境设置:

汇编语言是依赖于指令集和架构的处理器。在本教程中,我们使用英特尔32处理器,如奔腾。按照本教程中将需要:

1、一台IBM PC兼容电脑或任何同等

2、Linux操作系统副本

3、NASM汇编程序的副本


有很多很好的汇编程序,如:

1、微软汇编(MASM)

2、Borland公司的Turbo汇编(TASM)

3、GNU汇编器(GAS)


我们将使用NASM汇编,因为它是:

1、免费。可以从网络下载。有据可查的,会得到大量网上的信息。

2、可以用在Linux和Windows

3、安装NASM


如果选择“开发工具”,而安装Linux,可以随着Linux操作系统安装NASM,不需要单独下载并安装。

检查是否已经安装了NASM,采取以下步骤:


1、打开一个Linux终端。

2、输入whereis NASM,然后按ENTER键。

如果已经安装,则类似这样一行,nasm: /usr/bin/nasm将出现。否则将看到的只是NASM,那么需要安装NASM。


要安装NASM采取以下步骤:

1、详细访问NASM官网The netwide assembler (NASM) 查看最新版本。

2、下载Linux源归档文件nasm-X.XX. ta .gz。GZ,其中X.XX为NASM版本号到存档。 

3、解压缩到一个目录,创建一个子目录 nasm-X. XX.

4、进入目录 nasm-X. XX 然后输入 ./configure . 此shell脚本将找到最好的C编译器的使用和设置相应的Makefile。

5、输入 make 来建立NASM和ndisasm的二进制文件。

6、输入make install NASM和ndisasm安装在/usr/local/bin目录和安装手册页。


这应该在系统上安装NASM。另外在Linux系统中可以使用RPM分发。这个版本是简单安装,只需双击该RPM文件。


Assembly Language 教程结构概述

本教程共由20个章节构成,详细讲述了Assembly Language的基础使用方法:


本教程包含:

1、Assembly 基础介绍

2、Assembly 基本汇编语言

3、Assembly 位操作

4、Assembly 子程序

5、Assembly 数组

6、Assembly 浮点

7、结构体与C++

8、80X86指令


目录

Assembly 基础介绍

Assembly 环境设置
Assembly 数制
计算机内存和CPU的基础知识
计算机实模式和保护模式
计算机汇编语言和指令操作
Assembly 指示符
Assembly 输入输出和调试
Assembly创建一个程序的步骤

基本汇编语言

Assembly 整形表示法
Assembly 正负号延伸
Assembly 补码运算
Assembly 扩充精度运算
Assembly 控制结构
标准控制结构如何应用到Assembly

位操作

Assembly 移位操作
Assembly 布尔型按位运算
Assembly 避免使用条件分支
Assembly C中的按位运算
Assembly Big和Little Endian表示法
Assembly 计算位数的3种方法

子程序

Assembly 间接寻址及堆栈
Assembly CALL和RET指令
Assembly 调用约定
Assembly 多模块程序
C与汇编的接口技术
Assembly 可重入和递归子程序

数组

Assembly 数组详解
Assembly 更高级的间接寻址
Assembly 多维数组
Assembly 数组/串处理指令

浮点

Assembly 浮点表示法
Assembly 浮点运算
Assembly 数字协处理器

结构体与C++

Assembly 结构体
Assembly 重载函数和名字改编
Assembly 类的概念和样例介绍
Assembly 继承和多态

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }