汇编语言
![本页使用了标题或全文手工转换](http://upload.wikimedia.org/wikipedia/commons/thumb/c/cd/Zh_conversion_icon_m.svg/35px-Zh_conversion_icon_m.svg.png)
此条目需要扩充。 (2016年2月12日) |
![]() | |
编程范型 | 指令式编程 |
---|---|
发行时间 | 1949年 |
文件扩展名 | .asm |
汇编语言(英语:assembly language)[注 1][1]是任何一种用于电子计算机、微处理器、微控制器,或其他可编程器件的低级语言。在不同的设备中,汇编语言对应着不同的机器语言指令集。一种汇编语言专用于某种计算机系统结构,而不像许多高级语言,可以在不同系统平台之间移植。
使用汇编语言编写的源代码,然后通过相应的汇编程序将它们转换成可执行的机器代码。这一过程被称为汇编过程。
汇编语言使用助记符(Mnemonics)来代替和表示特定低级机器语言的操作。特定的汇编目标指令集可能会包括特定的操作数。许多汇编程序可以识别代表地址和常量的标签(Label)和符号(Symbols),这样就可以用字符来代表操作数而无需采取写死的方式。普遍地说,每一种特定的汇编语言和其特定的机器语言指令集是一一对应的。
许多汇编程序为程序开发、汇编控制、辅助调试提供了额外的支持机制。有的汇编语言编写工具经常会提供宏,它们也被称为宏汇编器。
现在汇编语言已不像其他大多数的程序设计语言一样被广泛用于程序设计,在今天的实际应用中,它通常被应用在底层硬件操作和高要求的程序优化的场合。驱动程序、嵌入式操作系统和实时运行程序中都会需要汇编语言。
工具
[编辑]典型的现代汇编器(assembler)建造目标代码,由解译组语指令集的助记符(Mnemonics)到操作码,并解析符号名称(Symbolic names)成为存储器地址以及其它的实体。使用符号参考(symbolic references)是汇编器的一个重要特征,它可以节省修改程序后人工转址(manual address updates)的乏味耗时计算。基本就是把机器码变成一些字母而已,编译的时候再把输入的指令字母替换成为晦涩难懂的机器码。
现状
[编辑]随着现代软件系统越来越庞大复杂,大量经过了封装的高级语言如C/C++,Pascal/Object Pascal也应运而生。这些新的语言使得程序员在开发过程中能够更简单,更有效率,使软件开发人员得以应付快速的软件开发的要求。而汇编语言由于其复杂性使得其适用领域逐步减小。但这并不意味着汇编已无用武之地。由于汇编更接近机器语言,能够直接对硬件进行操作,生成的程序与其他的语言相比具有更高的运行速度,占用更小的内存,因此在一些对于时效性(timeliness)要求很高的程序以及工业控制方面大量应用。
因此,虽然有众多编程语言可供选择,但汇编依然是各大学计算机科学类专业学生的必修课,以让学生深入了解计算机的运行原理。
汇编风格
[编辑]![](http://upload.wikimedia.org/wikipedia/commons/thumb/7/70/Rechts-_und_Linksshift.svg/220px-Rechts-_und_Linksshift.svg.png)
![](http://upload.wikimedia.org/wikipedia/commons/thumb/4/4d/Apple_II_Monitor.png/220px-Apple_II_Monitor.png)
![](http://upload.wikimedia.org/wikipedia/commons/thumb/6/60/System_370_Reference_Summary.jpg/220px-System_370_Reference_Summary.jpg)
x86/amd64汇编指令的两大风格分别是Intel汇编与AT&T汇编,分别被Microsoft Windows/Visual C++与GNU/Gas采用(Gas也可使用Intel汇编风格):
项目 | Intel风格 | AT&T风格 |
---|---|---|
操作数顺序 | 目标操作数在前 | 源操作数在前 |
寄存器 | 原样 | 加%前缀 |
立即数 | 原样 | 加$前缀 |
16进制立即数 | 用后缀B与H分别表示二进制与十六进制 对于16进制字母开头的要加前缀0 |
加前缀0x |
访问内存长度的表示 | 前缀BYTE PTR, WORD PTR, DWORD PTR
和QWORD PTR表示字节,字,双字和四字 |
后缀b,w,l,q表示字节,字,双字和四字 |
引用全局或静态变量var的值 | [var] | var |
引用全局或静态变量var的地址 | var | $var |
引用局部变量 | 需要基于栈指针(rsp) | |
绝对寻址 | [imm] | imm |
间接寻址 | [reg] | (%reg) |
基址相对寻址 | [reg +imm] | imm(%reg) |
变址寻址 | [base+index] | (base,index) |
变址寻址 | [base+index+imm] | imm(base,index) |
比例变址寻址 | [base + index * scale + imm] | imm(base, index, scale) |
scale只能是1,2,4,8其中的一个数字(1省略不写就是普通变址寻址) | ||
代码注释 | 单行注释用;+注释内容。例如:
mov rax, rdx ;这里是注释 | |
注意 | 这里imm为立即数,base和index为寄存器,scale为伸缩量 |
![](http://upload.wikimedia.org/wikipedia/commons/thumb/e/ee/IBM_keypunch_deck_for_Assembly_language_student_program_at_New_York_University_1979.jpg/220px-IBM_keypunch_deck_for_Assembly_language_student_program_at_New_York_University_1979.jpg)
相关著作
[编辑]- 王爽的《汇编语言》一书为汇编语言的教程,已经被一些大学当作教程使用。[2]类似的教程还包括《Windows环境下32位汇编语言程序设计》等等。
- 美国Duntemann, Jeff于2000年著作《组合语言步步学》 Assembly Language Step-by-Step。
- 澳洲Jorgensen, Ed 《x86-64架构组合语言于Ubuntu系统》x86-64 Assembly Language Programming with Ubuntu。
- 美国Waldron, John 的1998年著作《RISC系统下组合语言概论》 Introduction to RISC Assembly Language Programming. (ISBN 0-201-39828-1)
注释
[编辑]- ^ 汇编语言,英语:assembly language,assembler language
参考文献
[编辑]- ^ Assembler language (页面存档备份,存于互联网档案馆), IBM Knowledge center
- ^ 王爽. 汇编语言. 汇编语言 第三版. 北京: 清华大学出版社. 2013. ISBN 978-7-302-33314-2. OCLC 910380574.
参阅
[编辑]外部链接
[编辑]- (英文)NASM编译器
- (英文)Linux Assembly (页面存档备份,存于互联网档案馆)
- (英文)MASM32 (页面存档备份,存于互联网档案馆) 用MASM写Win32程序的小型SDK
- Assembly组合教学 (页面存档备份,存于互联网档案馆)
|
|