汇编语言

汇编语言[assembly (or assembler) language]通常缩写为asm,是用于计算机或其他可编程设备的低级编程语言,语言和架构的机器码指令之间存在非常强的(通常一对一)对应关系。每个汇编语言一般都是为特定的计算机体系结构服务的。相对而言,大多数高级编程语言通常可跨多个架构移植,当然它们需要解释或编译后才可以运行。汇编语言也可以称为机器符号语言。

汇编语言通过汇编器将实用程序转换为可执行机器代码,转换过程称之为汇编或源代码汇编。根据运行汇编程序的步骤计算确定汇编程序装载的时间。

汇编语言使用助记符来表示每个低级机器指令或操作指令,通常还会有结构寄存器,标志等。许多程序操作需要一个或多个操作指令来形成完整的操作,并且大多数汇编器可以获取并通过数字和命名的表达式常量以及寄存器和标签来进行操作,使程序员免于冗长的重复计算。根据不同的架构,汇编语言还可以使用偏移或其他数据以及固定地址来组合用于特定指令或寻址模式。许多汇编器提供了额外的机制来促进程序开发,控制汇编过程和进行辅助的调试。


Assembly language

安装

以最常见的intel格式的汇编程序为例,在Ubuntu 14.04上来做测试。

1.直接在ubuntu上更新或者安装nasm

1
$ sudo apt-get install nasm build-essential #Ubuntu的版本比较低是2.10.09

2.如果想要最新的版本可以到http://www.nasm.us/pub/nasm/releasebuilds/2.12.02/下载。下载后通过tar命令解压到自己的目录下。

1
2
$ wget http://www.nasm.us/pub/nasm/releasebuilds/2.12.02/nasm-2.12.02.tar.gz
$ tar zxvf nasm-2.12.02.tar.gz

Assembly language

然后进入目录编译安装一下:

1
2
3
4
$ cd nasm-2.12.02
$ ./configure
$ make
$ sudo make install

Assembly language

3.可以查看一下安装后的版本信息。

1
$ nasm -version

hello world

1.首先来编写一个helloworld汇编源代码文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
; hello.asm 
section .data ; 数据段声明
msg db "Hello, world!", 0xA ; 要输出的字符串
len equ $ - msg ; 字串长度
section .text ; 代码段声明
global _start ; 指定入口函数
_start: ; 在屏幕上显示一个字符串
mov edx, len ; 参数三:字符串长度
mov ecx, msg ; 参数二:要显示的字符串
mov ebx, 1 ; 参数一:文件描述符(stdout)
mov eax, 4 ; 系统调用号(sys_write)
int 0x80 ; 调用内核功能
; 退出程序
mov ebx, 0 ; 参数一:退出代码
mov eax, 1 ; 系统调用号(sys_exit)
int 0x80 ; 调用内核功能

2.汇编器(assembler)将汇编语言编写的源程序转换成二进制形式的目标代码。Linux 平台上经常用到的汇编器是NASM,它提供了很好的宏指令功能,并能够支持相当多的目标代码格式,包括bin、a.out、coff、elf、rdf 等。NASM 采用的是人工编写的语法分析器,因而执行速度很快,最重要的是它使用的是Intel汇编语法,可以用来编译用Intel语法格式编写的汇编程序:

1
$ nasm -f elf hello.asm

3.由汇编器产生的目标代码是不能直接在计算机上运行的,它必须经过链接器的处理才能生成可执行代码。链接器通常用来将多个目标代码连接成一个可执行代码,这样可以先将整个程序分成几个模块来进行单独的开发,然后再将它们链接成一个应用程序。 Linux使用ld命令来链接程序,它包含在binutils软件包中。汇编程序在成功通过NASM的编译后就可以生成目标代码,然后可以使用ld将其链接成可执行程序了:

1
$ ld -s -o hello hello.o

4.运行

1
$ ./hello