PC汇编语言
Paul A. Carter
翻译:伍星
2007 年 3 月 4 日
Copyright
c
° 2001, 2002, 2003, 2004 by Paul Carter
在没有作者的同意下,这个可以全部被翻版和发行(包含作者的身份,版
权和允许通知),规定不能由文档本身来收取任何费用。这就包括“明白使
用”的引用像评论和广告业,还有衍生工作像翻译。
注意这个限制并不打算禁止对打印或复制这个文档的服务进行收费。
鼓励教师把这个文档当作课堂资源来使用;不管怎样,得到在这种情况下
使用的通知,作者将非常感激。
目目目录录录
前前前言言言 i
第第第1章章章 简简简介介介 1
1.1 数制 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.1.1 十进制 . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.1.2 二进制 . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.1.3 十六进制 . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2 计算机结构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.2.1 内存 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.2.2 CPU . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.2.3 CPU 80x86系列 . . . . . . . . . . . . . . . . . . . . . 5
1.2.4 8086 16位寄存器 . . . . . . . . . . . . . . . . . . . . . 6
1.2.5 80386 32位寄存器 . . . . . . . . . . . . . . . . . . . . 7
1.2.6 实模式 . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.2.7 16位保护模式 . . . . . . . . . . . . . . . . . . . . . . . 8
1.2.8 32位保护模式 . . . . . . . . . . . . . . . . . . . . . . . 8
1.2.9 中断 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.3 汇编语言 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.3.1 机器语言 . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.3.2 汇编语言 . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.3.3 指令操作数 . . . . . . . . . . . . . . . . . . . . . . . . 10
1.3.4 基本指令 . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.3.5 指示符 . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.3.6 输入和输出 . . . . . . . . . . . . . . . . . . . . . . . . 14
1.3.7 调试 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.4 创建一个程序 . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.4.1 第一个程序 . . . . . . . . . . . . . . . . . . . . . . . . 16
1.4.2 编译器依赖 . . . . . . . . . . . . . . . . . . . . . . . . 18
1.4.3 汇编代码 . . . . . . . . . . . . . . . . . . . . . . . . . 19
1.4.4 编译C代码 . . . . . . . . . . . . . . . . . . . . . . . . 19
1.4.5 连接目标文件 . . . . . . . . . . . . . . . . . . . . . . . 20
1.4.6 理解一个汇编列表文件 . . . . . . . . . . . . . . . . . . 20
3
4
目录
1.5 骨架文件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
第第第2章章章 基基基本本本汇汇汇编编编语语语言言言 23
2.1 整形工作方式 . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.1.1 整形表示法 . . . . . . . . . . . . . . . . . . . . . . . . 23
2.1.2 正负号延伸 . . . . . . . . . . . . . . . . . . . . . . . . 25
2.1.3 补码运算 . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.1.4 程序例子 . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.1.5 扩充精度运算 . . . . . . . . . . . . . . . . . . . . . . . 31
2.2 控制结构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
2.2.1 比较 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
2.2.2 分支指令 . . . . . . . . . . . . . . . . . . . . . . . . . 33
2.2.3 循环指令 . . . . . . . . . . . . . . . . . . . . . . . . . 36
2.3 翻译标准的控制结构 . . . . . . . . . . . . . . . . . . . . . . . 36
2.3.1 If语句 . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
2.3.2 While循环 . . . . . . . . . . . . . . . . . . . . . . . . . 37
2.3.3 Do while循环 . . . . . . . . . . . . . . . . . . . . . . . 37
2.4 例子:查找素数 . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
第第第3章章章 位位位操操操作作作 41
3.1 移位操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.1.1 逻辑移位 . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.1.2 移位的应用 . . . . . . . . . . . . . . . . . . . . . . . . 42
3.1.3 算术移位 . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.1.4 循环移位 . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.1.5 简单应用 . . . . . . . . . . . . . . . . . . . . . . . . . 43
3.2 布尔型按位运算 . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3.2.1 AND运算符 . . . . . . . . . . . . . . . . . . . . . . . . 44
3.2.2 OR运算符 . . . . . . . . . . . . . . . . . . . . . . . . . 44
3.2.3 XOR运算 . . . . . . . . . . . . . . . . . . . . . . . . . 44
3.2.4 NOT 运算 . . . . . . . . . . . . . . . . . . . . . . . . . 45
3.2.5 TEST指令 . . . . . . . . . . . . . . . . . . . . . . . . . 45
3.2.6 位操作的应用 . . . . . . . . . . . . . . . . . . . . . . . 45
3.3 避免使用条件分支 . . . . . . . . . . . . . . . . . . . . . . . . 47
3.4 在C中进行位操作 . . . . . . . . . . . . . . . . . . . . . . . . . 49
3.4.1 C中的按位运算 . . . . . . . . . . . . . . . . . . . . . . 49
3.4.2 在C中使用按位运算 . . . . . . . . . . . . . . . . . . . 50
3.5 Big和Little Endian表示法 . . . . . . . . . . . . . . . . . . . . 51
3.5.1 什么时候需要在乎Little和Big Endian . . . . . . . . . 52
3.6 计算位数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
3.6.1 方法一 . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
3.6.2 方法二 . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
3.6.3 方法三 . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
目录
5
第第第4章章章 子子子程程程序序序 57
4.1 间接寻址 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
4.2 子程序的简单例子 . . . . . . . . . . . . . . . . . . . . . . . . 57
4.3 堆栈 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
4.4 CALL和RET指令 . . . . . . . . . . . . . . . . . . . . . . . . . 60
4.5 调用约定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
4.5.1 在堆栈上传递参数 . . . . . . . . . . . . . . . . . . . . 62
4.5.2 堆栈上的局部变量 . . . . . . . . . . . . . . . . . . . . 66
4.6 多模块程序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
4.7 C与汇编的接口技术 . . . . . . . . . . . . . . . . . . . . . . . 71
4.7.1 保存寄存器 . . . . . . . . . . . . . . . . . . . . . . . . 71
4.7.2 函数名 . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
4.7.3 传递参数 . . . . . . . . . . . . . . . . . . . . . . . . . 72
4.7.4 计算局部变量的地址 . . . . . . . . . . . . . . . . . . . 73
4.7.5 返回值 . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
4.7.6 其它调用约定 . . . . . . . . . . . . . . . . . . . . . . . 73
4.7.7 样例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
4.7.8 在汇编程序中调用C函数 . . . . . . . . . . . . . . . . . 78
4.8 可重入和递归子程序 . . . . . . . . . . . . . . . . . . . . . . . 78
4.8.1 递归子程序 . . . . . . . . . . . . . . . . . . . . . . . . 79
4.8.2 回顾一下C变量的储存类型 . . . . . . . . . . . . . . . 79
第第第5章章章 数数数组组组 83
5.1 介绍 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
5.1.1 定义数组 . . . . . . . . . . . . . . . . . . . . . . . . . 83
5.1.2 访问数组中的元素 . . . . . . . . . . . . . . . . . . . . 84
5.1.3 更高级的间接寻址 . . . . . . . . . . . . . . . . . . . . 86
5.1.4 例子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
5.1.5 多维数组 . . . . . . . . . . . . . . . . . . . . . . . . . 91
5.2 数组/串处理指令 . . . . . . . . . . . . . . . . . . . . . . . . . 93
5.2.1 读写内存 . . . . . . . . . . . . . . . . . . . . . . . . . 94
5.2.2 REP前缀指令 . . . . . . . . . . . . . . . . . . . . . . . 95
5.2.3 串比较指令 . . . . . . . . . . . . . . . . . . . . . . . . 96
5.2.4 REPx前缀指令 . . . . . . . . . . . . . . . . . . . . . . . 96
5.2.5 样例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
第第第6章章章 浮浮浮点点点 103
6.1 浮点表示法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
6.1.1 非整形的二进制数 . . . . . . . . . . . . . . . . . . . . 103
6.1.2 IEEE浮点表示法 . . . . . . . . . . . . . . . . . . . . . 105
6.2 浮点运算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
6.2.1 加法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
6.2.2 减法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
- 1
- 2
- 3
- 4
前往页