跳转到内容

汇编语言:修订间差异

维基百科,自由的百科全书
删除的内容 添加的内容
内容扩充 file ext
 
(未显示19个用户的32个中间版本)
第1行: 第1行:
{{expand|time=2016-02-12T17:50:06+00:00}}
{{expand|time=2016-02-12T17:50:06+00:00}}


{{NoteTA|G1=IT}}
{{NoteTA
|G1=IT
|T=zh-cn:汇编语言;zh-tw:組合語言;
|1=zh-cn:高级;zh-tw:高階;
}}


{{Infobox programming language
{{Infobox programming language
第8行: 第12行:
| logo caption =
| logo caption =
| screenshot = File:Motorola 6800 Assembly Language.png
| screenshot = File:Motorola 6800 Assembly Language.png
| caption = [[摩托罗拉]] MC6800 組合語言
| paradigm = [[指令式編程]]
| paradigm = [[指令式編程]]
| family =
| family =
第14行: 第17行:
| developer = <!-- or: | developers = -->
| developer = <!-- or: | developers = -->
| released = {{start date and age|1949}}
| released = {{start date and age|1949}}
| latest release version =
| latest release date = <!-- {{start date and age|YYYY|MM|DD|df=yes/no}} -->
| latest preview version =
| latest preview date = <!-- {{start date and age|YYYY|MM|DD|df=yes/no}} -->
| typing =
| typing =
| scope =
| scope =
第25行: 第24行:
| operating system =
| operating system =
| license =
| license =
| file ext =
| file ext = .asm
| file format = <!-- or: | file formats = -->
| file format = <!-- or: | file formats = -->
| website = <!-- {{url|www.example.com}} -->
| website = <!-- {{url|www.example.com}} -->
第34行: 第33行:
}}
}}


'''汇编语言'''({{lang-en|'''assembly language'''}}){{notetag|組合語言,{{lang-en|assembly language,assembler language}}}}<ref>[http://www-01.ibm.com/support/knowledgecenter/SSLTBW_2.1.0/com.ibm.zos.v2r1.asma400/asmr102112.htm Assembler language], IBM Knowledge center</ref>是一种用于[[电子计算机]]、[[微处理器]]、[[微控制器]],或其他可编程器件的[[低级语言]]。在不同的设备中,汇编语言对应着不同的[[机器语言]][[指令集架构|指令集]]。一种汇编语言专用于某种[[计算机系统结构]],而不像许多[[高级语言]],可以在不同系统平台之间移植。
'''汇编语言'''({{lang-en|assembly language}}){{notetag|組合語言,{{lang-en|assembly language,assembler language}}}}<ref>[http://www-01.ibm.com/support/knowledgecenter/SSLTBW_2.1.0/com.ibm.zos.v2r1.asma400/asmr102112.htm Assembler language] {{Wayback|url=http://www-01.ibm.com/support/knowledgecenter/SSLTBW_2.1.0/com.ibm.zos.v2r1.asma400/asmr102112.htm |date=20160304051928 }}, IBM Knowledge center</ref>是任何一种用于[[电子计算机]]、[[微处理器]]、[[微控制器]],或其他可编程器件的[[低级语言]]。在不同的设备中,汇编语言对应着不同的[[机器语言]][[指令集架构|指令集]]。一种汇编语言专用于某种[[计算机系统结构]],而不像许多[[高级语言]],可以在不同系统平台之间移植。


使用汇编语言编写的源代码,然后通过相应的汇编程序将它们转换成可执行的机器代码。这一过程被称为'''汇编过程'''。
使用汇编语言编写的源代码,然后通过相应的汇编程序将它们转换成可执行的机器代码。这一过程被称为'''汇编过程'''。
第42行: 第41行:
许多汇编程序为程序开发、汇编控制、辅助[[调试工具|调试]]提供了额外的支持机制。有的汇编语言编寫工具经常会提供[[巨集]],它们也被称为-{zh-hans:宏; zh-hant:巨;}-汇编器。
许多汇编程序为程序开发、汇编控制、辅助[[调试工具|调试]]提供了额外的支持机制。有的汇编语言编寫工具经常会提供[[巨集]],它们也被称为-{zh-hans:宏; zh-hant:巨;}-汇编器。


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


== 工具 ==
== 工具 ==
典型的現代'''組譯器'''(assembler)建造[[目的碼]],由解譯組語[[指令集]]的-{zh-hans:助记符; zh-hant:易記碼;}-(Mnemonics)到{{le|操作碼|OpCode}},並解析[[符號名稱]](Symbolic names)成為[[記憶體位址]]以及其它的實體。使用[[符號參考]]是組譯器的一個重要特徵,它可以節省修改程式後[[人工轉址]]的乏味耗時計算。基本就是把机器码变成一些字母而已,编译的时候再把输入的指令字母替换成为晦涩难懂的机器码。
典型的現代'''組譯器'''({{lang|en|assembler}})建造[[目的碼]],由解譯組語[[指令集]]的-{zh-hans:助记符; zh-hant:易記碼;}-({{lang|en|Mnemonics}})到{{le|操作碼|OpCode}},並解析[[標識符|符號名稱]]({{lang|en|Symbolic names}})成為[[記憶體位址]]以及其它的實體。使用[[符號參考]]({{lang|en|symbolic references}})是組譯器的一個重要特徵,它可以節省修改程式後[[人工轉址]]({{lang|en|manual address updates}})的乏味耗時計算。基本就是把机器码变成一些字母而已,编译的时候再把输入的指令字母替换成为晦涩难懂的机器码。


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


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


== 組譯風格 ==
== 組譯風格 ==
[[File:Rechts- und Linksshift.svg|thumb|汇编语言图解]]
[[File:Rechts- und Linksshift.svg|thumb|汇编语言图解]]
[[File:Apple II Monitor.png|thumb|[[Apple II]]时代的汇编语言]]

[[File:System 370 Reference Summary.jpg|thumb|IBM 370系統的說明書中汇编语言指令書]]
[[x86]]/[[amd64]]汇编指令的两大风格分别是[[Intel]]汇编与[[AT&T]]汇编,分别被[[Microsoft Windows]]/[[Visual C++]]与[[GNU]]/[[GNU汇编器|Gas]]采用(Gas也可使用Intel汇编风格):
[[x86]]/[[amd64]]汇编指令的两大风格分别是[[Intel]]汇编与[[AT&T]]汇编,分别被[[Microsoft Windows]]/[[Visual C++]]与[[GNU]]/[[GNU汇编器|Gas]]采用(Gas也可使用Intel汇编风格):
{| class="wikitable"
{| class="wikitable"
第62行: 第62行:
| 操作数顺序 || 目标操作数在前 || 源操作数在前
| 操作数顺序 || 目标操作数在前 || 源操作数在前
|-
|-
| 寄存器名字 || 原样 || 加%前缀
| 寄存器 || 原样 || 加%前缀
|-
|-
| 立即数 || 原样 || 加$前缀
| 立即数 || 原样 || 加$前缀
|-
|-
| 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)
|[imm]
|imm
|-
|-
| 寄存器间址|| [reg]|| (%reg)
| 间接寻址|| [reg]|| (%reg)
|-
|-
| 寄存器变址寻址|| [reg + _x]|| _x(%reg)
| 相对寻址|| [reg +imm]|| imm(%reg)
|-
|-
| 立即数变址寻址|| [reg + 1]|| 1(%reg)
| 变址寻址|| [base+index]|| (base,index)
|-
|-
|变址寻址
| 整数数组寻址|| [eax*4 + array]|| _array (,%eax, 4)
|[base+index+imm]
|imm(base,index)
|-
| rowspan="2" | 比例变址寻址 || [base + index * scale + imm]|| imm(base, index, scale)
|-
| colspan="2" |scale只能是1,2,4,8其中的一个数字(1省略不写就是普通变址寻址)
|-
|代码注释
| colspan="2" |单行注释用;+注释内容。例如:
mov    rax, rdx ;这里是注释
|-
|注意
| colspan="2" |这里imm为立即数,base和index为寄存器,scale为伸缩量
|}
|}
[[File:IBM keypunch deck for Assembly language student program at New York University 1979.jpg|thumb|1979年打孔卡時代的彙編語言卡片於紐約大學圖書館]]


== 注釋 ==
== 相关著作 ==
*王爽的《汇编语言》一书为汇编语言的教程,已经被一些大学当作教程使用。<ref>{{Cite book|edition=第三版|chapter=汇编语言|url=https://www.worldcat.org/oclc/910380574|publisher=清华大学出版社|date=2013|location=北京|isbn=978-7-302-33314-2|oclc=910380574|last=王爽|title=汇编语言}}</ref>类似的教程还包括《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)

== 注释 ==
{{NoteFoot}}
{{NoteFoot}}


== 参考文献 ==
== 参考文献 ==
{{Reflist}}
{{Reflist}}

== 参閱 ==
{{Portal box|计算机科学|计算机程序设计}}
{{div col|2}}
* [[編譯器]]
* [[高階組合語言]]
* [[指令集架構]]
* [[組合語言列表]]
* [[計算機科學課程列表]]
*[[X86#x86指令格式]]
{{div col end}}


== 外部連結 ==
== 外部連結 ==
第104行: 第139行:
}}
}}
* {{en}}[[:sourceforge:projects/nasm/|NASM編譯器]]
* {{en}}[[:sourceforge:projects/nasm/|NASM編譯器]]
* {{en}}[http://asm.sourceforge.net Linux Assembly]
* {{en}}[http://asm.sourceforge.net Linux Assembly] {{Wayback|url=http://asm.sourceforge.net/ |date=20010218121706 }}
* {{en}}[http://www.masm32.com/ MASM32] 用[[MASM]]寫[[Win32]]程式的小型[[SDK]]
* {{en}}[http://www.masm32.com/ MASM32] {{Wayback|url=http://www.masm32.com/ |date=20210128171022 }} 用[[MASM]]寫[[Win32]]程式的小型[[SDK]]
* [http://www.tw511.com/2/11/177.html Assembly組合教學] {{Wayback|url=http://www.tw511.com/2/11/177.html |date=20210204102701 }}

== 参见 ==
{{Portal box|计算机科学|计算机程序设计}}
* [[編譯器]]
* [[高階組合語言]]
* [[指令集架構]]
* [[組合語言列表]]
* [[計算機科學課程列表]]


{{-}}
{{-}}
{{程序設計語言}}
{{类别}}

{{Authority control}}
{{Authority control}}


[[Category:程序設計語言]]
[[Category:程序設計語言]]
[[Category:汇编语言| ]]
[[Category:汇编语言| ]]

[[pl:Asembler#Język asemblera]]
[[pl:Asembler#Język asemblera]]

2023年12月6日 (三) 17:16的最新版本

汇编语言
编程范型指令式編程
发行时间1949年,​75年前​(1949
文件扩展名.asm

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

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

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

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

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

工具[编辑]

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

现状[编辑]

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

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

組譯風格[编辑]

汇编语言图解
Apple II时代的汇编语言
IBM 370系統的說明書中汇编语言指令書

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为伸缩量
1979年打孔卡時代的彙編語言卡片於紐約大學圖書館

相关著作[编辑]

  • 王爽的《汇编语言》一书为汇编语言的教程,已经被一些大学当作教程使用。[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)

注释[编辑]

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

参考文献[编辑]

  1. ^ Assembler language页面存档备份,存于互联网档案馆), IBM Knowledge center
  2. ^ 王爽. 汇编语言. 汇编语言 第三版. 北京: 清华大学出版社. 2013. ISBN 978-7-302-33314-2. OCLC 910380574. 

参閱[编辑]

外部連結[编辑]