-
## 简明 X86 汇编语言教程
原创:司徒彦南 2002 年 4 月 8 日
徐远超于2010-02-25收集整理 2010-03-10第2次补充 2010-03-25第3次补充
目录
第0章写在前面.....2
第一章汇编语言简介.....3
第二章认识处理器.....4
2.1寄存器.....4
2.2使用寄存器.....6
第三章操作内存.....12
3 内联汇编基本形式.....56
3.扩展形式内联汇编.....56
4. 深入constra.....59
5. 结束语.....63
## 第 0 章 写在前面
我不想夸大或者贬低汇编语言。但我想说,汇编语言改变了20世纪的历史。与前辈相比,我们这一代编程人员足够的幸福,因为我们有各式各样的编程语言,我们可以操作键盘、坐在显示器面前,甚至使用鼠标、语音识别。我们可以使用键盘、鼠标来驾驭“个人 的具有“快速原型开发”能力的语言,却也是我们可以选择的语言中的一种。
每种计算机都有自己的汇编语言——没必要指望汇编语言的可移植性,选择汇编,意味着选择性能而不是可移植或便于调试。这份文档中讲述的是 x86 汇编语言,此后的“汇编语言”一词,如果不明示则表示 IA32 上的 x86 汇编语言。
汇编语言是一种易学,却很难精通的语言。回想当年,我从初学汇编到写出第一个可运行的程序,只用了不到4个
0 码力 |
63 页 |
598.28 KB
| 2 年前 3
-
0 码力 |
155 页 |
13.54 MB
| 2 年前 3
-
RISC-V 指令集架构所有的基本要素,是学生和从业者的完美参考指南。
——兰迪·卡茨(Randy Katz),加州大学伯克利分校教授,RAID 存储系统的发明者之一
RISC-V 是学生学习指令集架构和汇编语言编程的不错选择,二者是后续使用高级语言的基础。本书清晰地介绍了 RISC-V,还包含对其演化历史的深刻见解,以及与其他常见架构的对比。以过去的指令集架构为鉴,RISC-V 的设计者能规避一些不必要 地阐释了 RISC-V 指令系统架构设计的先进性。
对于计算机专业和电子工程专业师生及计算机系统架构师和处理器设计者来说,本书具有极好的参考价值。书中简明扼要地介绍了 RISC-V 各指令模块、汇编语言程序及汇编指示符和伪指令、过程调用约定、链接与加载、浮点运算指令、原子指令、压缩指令、向量指令、特权模式与特权指令等内容。通过阅读本书,读者可以快速了解 RISC-V 指令集架构最基础的内容和最核 编程序设计课程围绕指令集开展教学,但主要介绍指令的格式和功能,以及汇编程序的阅读和设计,未与计算机系统中的其他抽象层建立关联,使得学生无法理解指令集的意义及其在计算机系统中的作用,甚至认为指令集和汇编语言是过时的底层知识。因此,“一生一芯”计划 $ ^{1} $ 尝试从另一个角度讲解指令集:向学生展示 RISC-V 指令集的设计对程序和硬件有何影响,而不是按照指令集手册机械地讲解指令的格式和功能。
0 码力 |
223 页 |
15.31 MB
| 2 年前 3
-
RV32I, ARM-32, MIPS-32 和 x86-32 指令集 ..... 32
2.10 结束语 ..... 32
2.11 扩展阅读 ..... 33
第三章 RISC-V 汇编语言 ..... 41
3.1 导言 ..... 41
3.2 函数调用规范 (Calling convention) ..... 41
3.3 汇编器 ..... 43
3.4 链接器 年的指令集的基础上取其精华,去其糟粕。要评判一个指令集架构,不仅要看它包括了什么,而且要看它省略了什么。
随后我们会按顺序介绍这个模块化架构的每个组成部分。每一章都会包含一个用 RISC-V 汇编语言写成的程序,这是为了展示那一章所述的指令的用法,这样有助于汇编语言程序员学习 RISC-V 汇编。有时,我们还会列出用 ARM,MIPS 和 x86 写成的同样的程序,从而突出 RISC-V 在简洁性,以及成本、功耗、性能方面的优势。 2015年在英特尔的博客上有着3600条指令的统计结果[Rodgers and Uhlig 2017],这意味着x86指令的增长速率提高到了(在1978年到2015年之内)每四天增长一条。我们是用汇编语言指令计算的,他们想必算入了机器语言指令。正如第八章所解释的那样,这个增长的很大一部分是因为x86 ISA依赖于SIMD指令来实现数据级并行。
The AL register is the default
0 码力 |
164 页 |
8.85 MB
| 2 年前 3
-
给Go编译器提交过127个补丁,累计六万余行;
拥有Go官方git仓库提交权限;
全球贡献者排名长期处于前50名;
世界上90%的gopher都用过我写的代码;
编译器的重要性
只有1%的程序员懂汇编语言
汇编语言无法构建大型系统
操作系统内核也需要编译器才能运行起来
编译理论是图灵奖大户,仅次于计算复杂度理论
操作系统有后门,编译器的后门更致命
编译器的难题:任务爆炸
N种语言 * _end
tmp0 := i * i
s = s + tmp0
i = i + 1
goto _loop
_SSA IR: 没有人类可读的结构,
它更像汇编语言:
1. 赋值
2. 一元/二元运算
3. goto
4. if-goto
5. 传递参数/返回值
_end:
ret[0] = s
SSAIR
func ssa(n tmp0 = n - m
goto _end
_b2:
tmp0 = m - n
_end:
ret[0] = tmp0
SSA IR: 没有人类可读的结构,它更像汇编语言:
赋值
一元/二元运算
goto
if-goto
传递参数/返回值
中端体系无关优化:公共子表达式消除
$$
\mathrm {t m p} 0 = a * b
$$
0 码力 |
36 页 |
1.63 MB
| 1 月前 3
-
及以上(Linux 用户)
CMake 3.12 及以上(跨平台作业)
Git 2.x(作业上传到 GitHub)
CUDA Toolkit 10.0 以上(GPU 专题)
## I ❤️ C
第 0 章:汇编语言
## x64 架构下的寄存器模型

1
| R15D | R15W | R15B |
## AT&T 汇编语言
## GCC 编译器所生成的汇编语言就属于这种
|项目|AT&T|Intel|说明|
|---|---|---|---|
|寄存器命名|%eax|eax|Intel的不带%|
|操作数顺序|movl %eax 0 码力 |
108 页 |
9.47 MB
| 2 年前 3
-
external;
现在,你就能调用来自 BLOCK.OBJ 或 block.o 的 MoveWord 和 FillWord 例程了。
像上面的声明,经常用来访问由汇编语言编写的外部例程,你也可以直接在 Object Pascal 源代码中放置汇编语言写的例程。关于这方面的信息,请参考 Inline assembler code。
## 从库导入函数
要从一个动态调入库(.so 或 .DLL)导入例程,把如下格式的指示字 Integer): 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
| 2 年前 3
-
是命令相关的,如 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
| 2 年前 3
-
com/envoyproxy/envoy-wasm
## Web Assembly介绍
Mozilla官方定义:
WebAssembly是一种新的编码方式,可以在现代的网络浏览器中运行——它是一种低级的类汇编语言,具有紧凑的二进制格式,可以接近原生的性能运行,并为诸如C/C++等语言提供一个编译目标,以便它们可以在Web上运行。它也被设计为可以与JavaScript共存,允许两者一起工作。
WebAss
0 码力 |
43 页 |
2.90 MB
| 1 年前 3
-
条件跳转指令
- 让不占用相同资源的任务同时进行,这也是CPU流水线的初衷。但理想是美好的,现实是骨感的,对于程序来说,指令不只是一个简单的任务,有时候我们需要做判断,来决定要执行的具体任务,这就是分支,在
汇编语言中体现为条件跳转指令。
- 例如我们这里给任务清单加一个,如果烧开水时被烫伤,则直接去医院的特殊任务。
- 特点:一旦触发去医院这个支线,则后面的任务都不用做了,直接跳过。
0 码力 |
47 页 |
8.45 MB
| 2 年前 3