 简明 X86 汇编语言教程简明 X86 汇编语言教程 原创:司徒彦南 2002 年 4 月 8 日 徐远超于 2010-02-25 收集整理 2010-03-10 第 2 次补充 2010-03-25 第 3 次补充 目录 第 Ο 章 写在前面............................................................................ .......................................2 第一章 汇编语言简介.............................................................................................................3 第二章 认识处理器........................... .............................................................63 第 Ο 章 写在前面 我不想夸大或者贬低汇编语言。但我想说,汇编语言改变了 20 世纪的历史。与前辈相 比,我们这一代编程人员足够的幸福,因为我们有各式各样的编程语言,我们可以操作键盘、 坐在显示器面前,甚至使用鼠标、语音识别。我们可以使用键盘、鼠标来驾驭“个人计算机”,0 码力 | 63 页 | 598.28 KB | 1 年前3 简明 X86 汇编语言教程简明 X86 汇编语言教程 原创:司徒彦南 2002 年 4 月 8 日 徐远超于 2010-02-25 收集整理 2010-03-10 第 2 次补充 2010-03-25 第 3 次补充 目录 第 Ο 章 写在前面............................................................................ .......................................2 第一章 汇编语言简介.............................................................................................................3 第二章 认识处理器........................... .............................................................63 第 Ο 章 写在前面 我不想夸大或者贬低汇编语言。但我想说,汇编语言改变了 20 世纪的历史。与前辈相 比,我们这一代编程人员足够的幸福,因为我们有各式各样的编程语言,我们可以操作键盘、 坐在显示器面前,甚至使用鼠标、语音识别。我们可以使用键盘、鼠标来驾驭“个人计算机”,0 码力 | 63 页 | 598.28 KB | 1 年前3
 RISC-V 开放架构设计之道 1.0.0指令集架构所有的基本要素,是学生和从 业者的完美参考指南。 ——兰迪·卡茨(Randy Katz),加州大学伯克利分校教授,RAID 存储系统的 发明者之一 RISC-V 是学生学习指令集架构和汇编语言编程的不错选择,二者是后续使用高 级语言的基础。本书清晰地介绍了 RISC-V,还包含对其演化历史的深刻见解,以 及与其他常见架构的对比。以过去的指令集架构为鉴,RISC-V 的设计者能规避 示例对比,都深刻地阐释了 RISC-V 指令系统架构设计的先进性。 对于计算机专业和电子工程专业师生及计算机系统架构师和处理器设计者来说, 本书具有极好的参考价值。书中简明扼要地介绍了 RISC-V 各指令模块、汇编语言程 序及汇编指示符和伪指令、过程调用约定、链接与加载、浮点运算指令、原子指令、 压缩指令、向量指令、特权模式与特权指令等内容。通过阅读本书,读者可以快速了 解 RISC-V 指令集架构最基础 程围绕 指令集开展教学,但主要介绍指令的格式和功能,以及汇编程序的阅读和设计,未与 计算机系统中的其他抽象层建立关联,使得学生无法理解指令集的意义及其在计算机 系统中的作用,甚至认为指令集和汇编语言是过时的底层知识。因此,“一生一芯” 计 划1尝试从另一个角度讲解指令集:向学生展示 RISC-V 指令集的设计对程序和硬件 有何影响,而不是按照指令集手册机械地讲解指令的格式和功能。 本书高度契合上述需求。原书的两位作者均为0 码力 | 223 页 | 15.31 MB | 1 年前3 RISC-V 开放架构设计之道 1.0.0指令集架构所有的基本要素,是学生和从 业者的完美参考指南。 ——兰迪·卡茨(Randy Katz),加州大学伯克利分校教授,RAID 存储系统的 发明者之一 RISC-V 是学生学习指令集架构和汇编语言编程的不错选择,二者是后续使用高 级语言的基础。本书清晰地介绍了 RISC-V,还包含对其演化历史的深刻见解,以 及与其他常见架构的对比。以过去的指令集架构为鉴,RISC-V 的设计者能规避 示例对比,都深刻地阐释了 RISC-V 指令系统架构设计的先进性。 对于计算机专业和电子工程专业师生及计算机系统架构师和处理器设计者来说, 本书具有极好的参考价值。书中简明扼要地介绍了 RISC-V 各指令模块、汇编语言程 序及汇编指示符和伪指令、过程调用约定、链接与加载、浮点运算指令、原子指令、 压缩指令、向量指令、特权模式与特权指令等内容。通过阅读本书,读者可以快速了 解 RISC-V 指令集架构最基础 程围绕 指令集开展教学,但主要介绍指令的格式和功能,以及汇编程序的阅读和设计,未与 计算机系统中的其他抽象层建立关联,使得学生无法理解指令集的意义及其在计算机 系统中的作用,甚至认为指令集和汇编语言是过时的底层知识。因此,“一生一芯” 计 划1尝试从另一个角度讲解指令集:向学生展示 RISC-V 指令集的设计对程序和硬件 有何影响,而不是按照指令集手册机械地讲解指令的格式和功能。 本书高度契合上述需求。原书的两位作者均为0 码力 | 223 页 | 15.31 MB | 1 年前3
 RISC-V 手册 v2(一本开源指令集的指南)................................................................................. 33 第三章 RISC-V 汇编语言 ................................................................................................. 评判一个指令集架构,不仅要看它 包括了什么,而且要看它省略了什么。 随后我们会按顺序介绍这个模块化架构的每个组成部分。每一章都会包含一个用 RISC- V 汇编语言写成的程序,这是为了展示那一章所述的指令的用法,这样有助于汇编语言程序 员学习 RISC-V 汇编。有时,我们还会列出用 ARM,MIPS 和 x86 写成的同样的程序,从而 突出 RISC-V 在简洁性,以及成本、功耗、性能方面的优势。 5年在英特尔的博客上有着 3600条指令的统计结果[Rodgers and Uhlig 2017],这意味着x86指令的增长速率提高到了(在1978年到 2015年之内)每四天增长一条。我们是用汇编语言指令计算的,他们想必算入了机器语言指令。正如第八 章所解释的那样,这个增长的很大一部分是因为x86 ISA依赖于SIMD指令来实现数据级并行。 图1.3:x86-32 ASCII0 码力 | 164 页 | 8.85 MB | 1 年前3 RISC-V 手册 v2(一本开源指令集的指南)................................................................................. 33 第三章 RISC-V 汇编语言 ................................................................................................. 评判一个指令集架构,不仅要看它 包括了什么,而且要看它省略了什么。 随后我们会按顺序介绍这个模块化架构的每个组成部分。每一章都会包含一个用 RISC- V 汇编语言写成的程序,这是为了展示那一章所述的指令的用法,这样有助于汇编语言程序 员学习 RISC-V 汇编。有时,我们还会列出用 ARM,MIPS 和 x86 写成的同样的程序,从而 突出 RISC-V 在简洁性,以及成本、功耗、性能方面的优势。 5年在英特尔的博客上有着 3600条指令的统计结果[Rodgers and Uhlig 2017],这意味着x86指令的增长速率提高到了(在1978年到 2015年之内)每四天增长一条。我们是用汇编语言指令计算的,他们想必算入了机器语言指令。正如第八 章所解释的那样,这个增长的很大一部分是因为x86 ISA依赖于SIMD指令来实现数据级并行。 图1.3:x86-32 ASCII0 码力 | 164 页 | 8.85 MB | 1 年前3
 Object Pascal 参考手册(Ver 0.1) external; 现在,你就能调用来自 BLOCK.OBJ 或 block.o 的 MoveWord 和 FillWord 例程了。 像上面的声明,经常用来访问由汇编语言编写的外部例程,你也可以直接在 Object Pascal 源代码中放置 汇编语言写的例程。关于这方面的信息,请参考 Inline assembler code。 从库导入函数 要从一个动态调入库(.so 或.DLL)导入例程,把如下格式的指示字 Integer; local; 它不刷新 EBX 寄存器,因此 • 它不能从一个库输出; • 它不能在单元的接口部分声明; • 不能取得它的地址或赋给一个过程类型的变量; • 若它完全是一个汇编语言例程,除非调用者设置了 EBX 寄存器,否则不能从其它单元调用它 The exports clause(exports 子句) 当一个例程在 exports 子句中列出时,它将被输出,它的格式如下 ECX;C 和 E 作 为双字和指针被压入栈,和它们声明的顺序一样。 寄存器保存约定 过程和函数必须保留 EBX、ESI、EDI 和 EBP 寄存器,但可以修改 EAX、EDX 和 ECX。当在汇编语言 中实现构造和销毁时,保证预留 DL 寄存器。过程和函数被调用时,是假定 CPU 的 direction 标志是清除 的(对应于 CLD 指令),并且返回时,direction 标志也必须是清除的。0 码力 | 168 页 | 868.25 KB | 1 年前3 Object Pascal 参考手册(Ver 0.1) external; 现在,你就能调用来自 BLOCK.OBJ 或 block.o 的 MoveWord 和 FillWord 例程了。 像上面的声明,经常用来访问由汇编语言编写的外部例程,你也可以直接在 Object Pascal 源代码中放置 汇编语言写的例程。关于这方面的信息,请参考 Inline assembler code。 从库导入函数 要从一个动态调入库(.so 或.DLL)导入例程,把如下格式的指示字 Integer; local; 它不刷新 EBX 寄存器,因此 • 它不能从一个库输出; • 它不能在单元的接口部分声明; • 不能取得它的地址或赋给一个过程类型的变量; • 若它完全是一个汇编语言例程,除非调用者设置了 EBX 寄存器,否则不能从其它单元调用它 The exports clause(exports 子句) 当一个例程在 exports 子句中列出时,它将被输出,它的格式如下 ECX;C 和 E 作 为双字和指针被压入栈,和它们声明的顺序一样。 寄存器保存约定 过程和函数必须保留 EBX、ESI、EDI 和 EBP 寄存器,但可以修改 EAX、EDX 和 ECX。当在汇编语言 中实现构造和销毁时,保证预留 DL 寄存器。过程和函数被调用时,是假定 CPU 的 direction 标志是清除 的(对应于 CLD 指令),并且返回时,direction 标志也必须是清除的。0 码力 | 168 页 | 868.25 KB | 1 年前3
 跟我一起写 Makefile (PDF 重制版)令相关的,如 CC ;一种是参数相的关,如 CFLAGS 。下面是所有隐含规则中会用到的变量: 9.3.1 关于命令的变量。 • AR : 函数库打包程序。默认命令是 ar • AS : 汇编语言编译程序。默认命令是 as • CC : C 语言编译程序。默认命令是 cc • CXX : C++ 语言编译程序。默认命令是 g++ • CO : 从 RCS 文件中扩展文件程序。默认命令是 关于命令参数的变量 下面的这些变量都是相关上面的命令的参数。如果没有指明其默认值,那么其默认值都是空。 • ARFLAGS : 函数库打包程序 AR 命令的参数。默认值是 rv • ASFLAGS : 汇编语言编译器参数。(当明显地调用 .s 或 .S 文件时) • CFLAGS : C 语言编译器参数。 • CXXFLAGS : C++ 语言编译器参数。 • COFLAGS : RCS 命令参数。0 码力 | 81 页 | 628.51 KB | 1 年前3 跟我一起写 Makefile (PDF 重制版)令相关的,如 CC ;一种是参数相的关,如 CFLAGS 。下面是所有隐含规则中会用到的变量: 9.3.1 关于命令的变量。 • AR : 函数库打包程序。默认命令是 ar • AS : 汇编语言编译程序。默认命令是 as • CC : C 语言编译程序。默认命令是 cc • CXX : C++ 语言编译程序。默认命令是 g++ • CO : 从 RCS 文件中扩展文件程序。默认命令是 关于命令参数的变量 下面的这些变量都是相关上面的命令的参数。如果没有指明其默认值,那么其默认值都是空。 • ARFLAGS : 函数库打包程序 AR 命令的参数。默认值是 rv • ASFLAGS : 汇编语言编译器参数。(当明显地调用 .s 或 .S 文件时) • CFLAGS : C 语言编译器参数。 • CXXFLAGS : C++ 语言编译器参数。 • COFLAGS : RCS 命令参数。0 码力 | 81 页 | 628.51 KB | 1 年前3
 Service Mesh 发展趋势(续) 蚂蚁金服 | 骑士到中盘路向何方?Part 2:ServiceMesh灵魂拷问二:性能有了,架构怎么办? Mozilla官方定义: WebAssembly是一种新的编码方式,可以在现代的网络浏览器中运行 - 它是一种低级的类汇编语言,具有 紧凑的二进制格式,可以接近原生的性能运行,并为诸如C / C ++等语言提供一个编译目标,以便它们可以 在Web上运行。它也被设计为可以与JavaScript共存,允许两者一起工作。 W0 码力 | 43 页 | 2.90 MB | 6 月前3 Service Mesh 发展趋势(续) 蚂蚁金服 | 骑士到中盘路向何方?Part 2:ServiceMesh灵魂拷问二:性能有了,架构怎么办? Mozilla官方定义: WebAssembly是一种新的编码方式,可以在现代的网络浏览器中运行 - 它是一种低级的类汇编语言,具有 紧凑的二进制格式,可以接近原生的性能运行,并为诸如C / C ++等语言提供一个编译目标,以便它们可以 在Web上运行。它也被设计为可以与JavaScript共存,允许两者一起工作。 W0 码力 | 43 页 | 2.90 MB | 6 月前3
 Rust 语言学习笔记M:N 模型:M 个绿色线程对应 N 个 OS 线程,这里 M 和 N 不必相同。 在当前上下文中,运行时 代表二进制文件中包含的由语言自身提供的代码。 这些代码根据语言的不同可大可小,不过任何非汇编语言都会有一定数量的运 行时代码。为此,通常人们说一个语言 “没有运行时”,一般意味着 “小运 行时”。更小的运行时拥有更少的功能不过其优势在于更小的二进制输出,这 使其易于在更多上下文中与其他语言相结合。虽然很多语言觉得增加运行时来0 码力 | 117 页 | 2.24 MB | 1 年前3 Rust 语言学习笔记M:N 模型:M 个绿色线程对应 N 个 OS 线程,这里 M 和 N 不必相同。 在当前上下文中,运行时 代表二进制文件中包含的由语言自身提供的代码。 这些代码根据语言的不同可大可小,不过任何非汇编语言都会有一定数量的运 行时代码。为此,通常人们说一个语言 “没有运行时”,一般意味着 “小运 行时”。更小的运行时拥有更少的功能不过其优势在于更小的二进制输出,这 使其易于在更多上下文中与其他语言相结合。虽然很多语言觉得增加运行时来0 码力 | 117 页 | 2.24 MB | 1 年前3
 2021 中国开源年度报告153.16% 3 Rust 115.01% 4 Verilog 84.54% 5 TypeScript 81.12% 6 Tex / LaTex 80.68% 7 R 69.64% 8 汇编语言 60.9% 9 PowerShell 60.65% 10 Kotlin 59.96% Rust 连续三年保持高速增长,增长率均超过 110%。 2021 年基础软件在国内热度持续走高,Verilog0 码力 | 132 页 | 14.24 MB | 1 年前3 2021 中国开源年度报告153.16% 3 Rust 115.01% 4 Verilog 84.54% 5 TypeScript 81.12% 6 Tex / LaTex 80.68% 7 R 69.64% 8 汇编语言 60.9% 9 PowerShell 60.65% 10 Kotlin 59.96% Rust 连续三年保持高速增长,增长率均超过 110%。 2021 年基础软件在国内热度持续走高,Verilog0 码力 | 132 页 | 14.24 MB | 1 年前3
 Go 入门指南(The way to Go)有着更显著的优势,因为它在解决一些很难用 C++ 解决的问题的同时,让我的工作变得更加高效。我并不是说 C++ 的存在是一个错误,相反地,我认 为这是历史发展的必然结果。当我深陷在 C 语言这门略微比汇编语言好一点的泥潭时,我坚信任何语言的 构造都不可能支持大型项目的开发。像垃圾回收或并发语言支持这类东西,在当时都是极其荒谬的主意, 根本没有人在乎。C++ 向大型项目开发迈出了重要的第一步,带领我们走进这个广袤无垠的世界。很庆幸 程序中被引用。 9.8.3 依赖系统的代码 不同操作系统上运行不同的程序是非常少见的:绝大多数情况下语言和标准库解决了大部分的可移植性问 题。 你有一个很好的理由去写平台平台特定的代码,例如汇编语言。这种情况下,按照下面的约定是合理的: prog1.go prog1_linux.go prog1_darwin.go prog1_windows.go prog1.go 定义了不同操作系统通用的接口,并将系统特定的代码写到0 码力 | 380 页 | 2.97 MB | 1 年前3 Go 入门指南(The way to Go)有着更显著的优势,因为它在解决一些很难用 C++ 解决的问题的同时,让我的工作变得更加高效。我并不是说 C++ 的存在是一个错误,相反地,我认 为这是历史发展的必然结果。当我深陷在 C 语言这门略微比汇编语言好一点的泥潭时,我坚信任何语言的 构造都不可能支持大型项目的开发。像垃圾回收或并发语言支持这类东西,在当时都是极其荒谬的主意, 根本没有人在乎。C++ 向大型项目开发迈出了重要的第一步,带领我们走进这个广袤无垠的世界。很庆幸 程序中被引用。 9.8.3 依赖系统的代码 不同操作系统上运行不同的程序是非常少见的:绝大多数情况下语言和标准库解决了大部分的可移植性问 题。 你有一个很好的理由去写平台平台特定的代码,例如汇编语言。这种情况下,按照下面的约定是合理的: prog1.go prog1_linux.go prog1_darwin.go prog1_windows.go prog1.go 定义了不同操作系统通用的接口,并将系统特定的代码写到0 码力 | 380 页 | 2.97 MB | 1 年前3
 Linux命令大全搜索工具 v1.8到 MAC 转换表 arpd 收集免费ARP信息 arping 通过发送ARP协议报文测试网络 arptables 管理ARP包过滤规则表 arpwatch 监听网络上ARP的记录 as 汇编语言编译器 at 在指定时间执行一个任务 atop 监控Linux系统资源与进程的工具 atq 列出当前用户的at任务列表 atrm 删除待执行任务队列中的指定任务 awk 文本和数据进行处理的编程语言 到 MAC 转换表 arpd 收集免费ARP信息 arping 通过发送ARP协议报文测试网络 arptables 管理ARP包过滤规则表 arpwatch 监听网络上ARP的记录 as 汇编语言编译器 at 在指定时间执行一个任务 atop 监控Linux系统资源与进程的工具 atq 列出当前用户的at任务列表 atrm 删除待执行任务队列中的指定任务 awk 文本和数据进行处理的编程语言 听。 arpwatch 补充说明 语法 选项 arpwatch 监听网络上ARP的记录 - 68 - 本文档使用 书栈网 · BookStack.CN 构建 汇编语言编译器 as命令 GNU组织推出的一款汇编语言编译器,它支持多种不同类型的处理器。 1. as(选项)(参数) 1. -ac:忽略失败条件; 2. -ad:忽略调试指令; 3. -ah:包括高级源; 4. -al:包括装配;0 码力 | 1347 页 | 8.79 MB | 1 年前3 Linux命令大全搜索工具 v1.8到 MAC 转换表 arpd 收集免费ARP信息 arping 通过发送ARP协议报文测试网络 arptables 管理ARP包过滤规则表 arpwatch 监听网络上ARP的记录 as 汇编语言编译器 at 在指定时间执行一个任务 atop 监控Linux系统资源与进程的工具 atq 列出当前用户的at任务列表 atrm 删除待执行任务队列中的指定任务 awk 文本和数据进行处理的编程语言 到 MAC 转换表 arpd 收集免费ARP信息 arping 通过发送ARP协议报文测试网络 arptables 管理ARP包过滤规则表 arpwatch 监听网络上ARP的记录 as 汇编语言编译器 at 在指定时间执行一个任务 atop 监控Linux系统资源与进程的工具 atq 列出当前用户的at任务列表 atrm 删除待执行任务队列中的指定任务 awk 文本和数据进行处理的编程语言 听。 arpwatch 补充说明 语法 选项 arpwatch 监听网络上ARP的记录 - 68 - 本文档使用 书栈网 · BookStack.CN 构建 汇编语言编译器 as命令 GNU组织推出的一款汇编语言编译器,它支持多种不同类型的处理器。 1. as(选项)(参数) 1. -ac:忽略失败条件; 2. -ad:忽略调试指令; 3. -ah:包括高级源; 4. -al:包括装配;0 码力 | 1347 页 | 8.79 MB | 1 年前3
共 20 条
- 1
- 2













