通过之前的学习我们知道了计算机做任何工作都是由存储在其中的程序来控制的,而程序(Program)是由一条条的指令和各种数据组成的,而且这些指令和数据都是由只有 0 和 1 两种符号的二进制数来表示的(见代码清单 1)。
00000000 00111110 11001111
00000010 11010011 00000000
00000100 00111110 11111111
00000110 11010011 00000000
00001000 00111110 11001111
00001010 11010011 00000011
00010100 11000011 00010000 00000000
在计算机世界中,把这种用二进制代码表示的计算机能直接识别和执行的指令和数据的集合(程序)称为“机器语言”(面向机器的语言)。
机器语言是唯一一种 CPU 能直接理解并执行的编程语言,用其他语言编写的程序计算机是不能直接运行的,必须先转换成机器语言。
就如同在人类世界中把用 a~z 26 个英文字母组成的语言称为英语一样,在人类世界中,除了英语外,还有汉语、日语、法语等各种不同的语言。在计算机世界中,除了用二进制代码表示的机器语言外,还有汇编语言、BASIC 语言、Pascal 语言、C语言、Java 语言、Visual Basic 语言、PHP 语言、HTML 语言等,以上这些都统称为计算机的程序设计语言。
机器语言是最底层的计算机语言,用机器语言编写的程序都是由 8bit 二进制数构成的。每个 8bit 的二进制数都是有特定含义的指令或数据。可对于人而言,看到的都是 0 和 1 的组合,很难判断各个组合都表示什么。
于是就有人发明了另一种编程方法,根据表示指令功能的英语单词给每一种指令起一个相似的昵称,并用这个昵称来代替表示指令的 0 和 1 的二进制数组合,而数据则用我们更容易接受的十六进制数或十进制数来表示(代码清单2)。这种类似英语单词的昵称叫作“助记符”,我们把这种使用“助记符”的编程语言称为“汇编语言”。
代码清单 2:汇编语言程序示例(输出“Hello,world!”)
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 ;调用内核功能
用汇编语言编写的程序计算机是不能直接运行的,必须先转换成机器语言。机器语言是唯一一种CPU能直接理解并执行的编程语言。
汇编语言的助记符以及数据和机器语言的二进制代码都是一一对应的,都是针对计算机硬件的,也就是说都是面向机器的语言。不同的计算机硬件(CPU)所用的助记符和二进制代码是不一样的,所以这样的程序其通用性不好,如果把它移植到其他的计算机上就无法正常运行了。我们通常把机器语言和汇编语言称为低级语言。