跳转到内容

汇编语言:修订间差异

维基百科,自由的百科全书
删除的内容 添加的内容
因为现在的计算机已经大部分都是64位了,所以有部分内容较为过时,需要修改。
第66行: 第66行:
| 立即数 || 原样 || 加$前缀
| 立即数 || 原样 || 加$前缀
|-
|-
| 16进制立即数 || 用后缀bh分别表示二进制与十六进制<br />对于16进制字母开头的要加前缀0 || 加前缀0x
| 16进制立即数 || 用后缀BH分别表示二进制与十六进制<br />对于16进制字母开头的要加前缀0 || 加前缀0x
|-
|-
| 访问内存长度的表示 || 前缀byte ptr, word ptr, dword ptr || 后缀b、w、l表示字节、字、长型
| 访问内存长度的表示 || 前缀BYTE PTR, WORD PTR, DWORD PTR
和QWORD PTR表示字节,字,双字和四字
| 后缀b,w,l,q表示字节,字,双字和四字
|-
|-
| 引用全局或静态变量var的值 || [_var] || _var
| 引用全局或静态变量var的值 || [var] || var
|-
|-
| 引用全局或静态变量var的地址|| _var|| $_var
| 引用全局或静态变量var的地址|| var|| $var
|-
|-
| 引用局部变量
| 引用局部变量
|colspan="2" | 需要基于栈指针(ESP)
|colspan="2" | 需要基于栈指针(rsp)
|-
|-
| 内存直接寻址 || seg_reg: [base + index * scale + immed32]|| seg_reg: immed32 (base, index, scale)
| 内存直接寻址 || seg_reg: imm[base + index * scale ]|| seg_reg: imm (base, index, scale)
|-
|-
| 寄存器间址|| [reg]|| (%reg)
| 寄存器间址|| [reg]|| (%reg)
|-
|-
| 寄存器变址寻址|| [reg + _x]|| _x(%reg)
| 寄存器变址寻址|| x[reg ]|| x(%reg)
|-
|-
| 立即数变址寻址|| [reg + 1]|| 1(%reg)
| 立即数变址寻址|| 1[reg ]|| 1(%reg)
|-
|-
| 整数数组寻址|| [eax*4 + array]|| _array (,%eax, 4)
| 整数数组寻址|| array[eax*4 ]|| array (,%eax, 4)
|-
|代码注释
| colspan="2" |单行注释用;+注释内容。例如:
mov    rax, rdx ;这里是注释
|}
|}



2019年7月13日 (六) 07:14的版本

汇编语言
编程范型指令式編程
发行时间1949年,​75年前​(1949

汇编语言(英語:assembly language[註 1][1]是一种用于电子计算机微处理器微控制器,或其他可编程器件的低级语言。在不同的设备中,汇编语言对应着不同的机器语言指令集。一种汇编语言专用于某种计算机系统结构,而不像许多高级语言,可以在不同系统平台之间移植。

使用汇编语言编写的源代码,然后通过相应的汇编程序将它们转换成可执行的机器代码。这一过程被称为汇编过程

汇编语言使用助记符(Mnemonics)来代替和表示特定低级机器语言的操作。特定的汇编目标指令集可能会包括特定的操作数。许多汇编程序可以识别代表地址和常量的标签(Label)和符号(Symbols),这样就可以用字符来代表操作数而无需采取写死的方式。普遍地说,每一种特定的汇编语言和其特定的机器语言指令集是一一对应的。

许多汇编程序为程序开发、汇编控制、辅助调试提供了额外的支持机制。有的汇编语言编寫工具经常会提供巨集,它们也被称为宏汇编器。

现在汇编语言已不像其他大多數的程序設計語言一樣被廣泛用于程序設計,在今天的實際應用中,它通常被應用在底層硬件操作和高要求的程序優化的场合。驅動程序、嵌入式操作系统和實時運行程序都会需要汇编語言。

工具

典型的現代組譯器(assembler)建造目的碼,由解譯組語指令集的助记符(Mnemonics)到操作碼英语OpCode,並解析符號名稱(Symbolic names)成為記憶體位址以及其它的實體。使用符號參考是組譯器的一個重要特徵,它可以節省修改程式後人工轉址的乏味耗時計算。基本就是把机器码变成一些字母而已,编译的时候再把输入的指令字母替换成为晦涩难懂的机器码。

现状

随着现代软件系统越来越庞大复杂,大量经过了封装的高级语言如C/C++Pascal/Object Pascal也应运而生。这些新的语言使得程序员在开发过程中能够更简单,更有效率,使软件开发人员得以应付快速的软件开发的要求。而汇编语言由于其复杂性使得其适用领域逐步减小。但这并不意味着汇编已无用武之地。由于汇编更接近机器语言,能够直接对硬件进行操作,生成的程序与其他的语言相比具有更高的运行速度,占用更小的内存,因此在一些对于时效性要求很高的程序、许多大型程序的核心模块以及工业控制方面大量应用。

此外,虽然有众多编程语言可供选择,但汇编依然是各大學计算机科学类专业学生的必修课,以讓學生深入了解计算机的运行原理。

組譯風格

汇编语言图解

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)
内存直接寻址 seg_reg: imm[base + index * scale ] seg_reg: imm (base, index, scale)
寄存器间址 [reg] (%reg)
寄存器变址寻址 x[reg ] x(%reg)
立即数变址寻址 1[reg ] 1(%reg)
整数数组寻址 array[eax*4 ] array (,%eax, 4)
代码注释 单行注释用;+注释内容。例如:

mov    rax, rdx ;这里是注释

注釋

  1. ^ 組合語言,英語:assembly language,assembler language

参考文献

  1. ^ Assembler language, IBM Knowledge center

外部連結

参见