第六章 Turbo Assembler与Turbo C的接口 1
6.1 在Turbo C中使用内部汇编 1
6.1.1 内部汇编如何工作 2
6.1.1.1 Turbo C如何知道使用内部汇编模式 6
6.1.1.2 激活Turbo Assembler处理内部汇编 7
6.1.1.3 Turbo C在何处汇编内部汇编码 7
6.1.1.4 将-1开关用于80186/80286指令 8
6.1.2 内部汇编语句的格式 9
6.1.2.1 内部汇编中的分号 9
6.1.2.2 内部汇编中的注释 9
6.1.2.3 访问结构/联合的元素 10
6.1.3 内部汇编示例 12
6.1.4 内部汇编的限制 15
6.1.4.1 内存和地址操作数限制 15
6.1.4.2 内部汇编中缺少隐含的自动变量大小 16
6.1.4.3 必须保存寄存器 17
6.1.5 内部汇编码相对于纯C代码的缺点 18
6.1.5.1 降低了可移植性和可维护性 18
6.1.5.2 降低了编译速度 18
6.1.5.3 仅可由TCC使用 18
6.1.5.4 损失了优化能力 18
6.1.5.5 限制了对错误的反跟踪 19
6.1.5.6 调试限制 19
6.1.5.7 用C开发而用内部汇编编译最终代码 19
6.2 在Turbo C中调用Turbo Assembler函数 20
6.2.1 Turbo C与Turbo Assembler的接口机制 21
6.2.1.1 内存模式与段 21
6.2.1.2 公共量和外部量 28
6.2.2 Turbo Assembler与Turbo C的交互性 32
6.2.2.1 参数传递 32
6.2.2.2 保存寄存器 39
6.2.2.3 返回值 39
6.2.3 从Turbo C中调用Turbo Assembler函数 40
6.2.4 Pascal调用约定 43
6.3 在Turbo Assembler中调用Turbo C 44
6.3.1 连入C的启动码 45
6.3.2 确保已正确设置了段 45
6.3.3 执行调用 45
6.3.4 在Turbo Assembler中调用Turbo C函数 46
第七章 Turbo Assembler与Turbo Pascal的接口 49
7.1 Turbo Pascal内存映象 49
7.1.1 程序段前缀 49
7.1.2 代码段 49
7.1.3 全局数据段 50
7.1.4 堆栈 50
7.1.5 堆 51
7.2 Turbo Pascal中寄存器的用法 51
7.3 近调用还是远调用 51
7.4 与Turbo Pascal共享信息 51
7.4.1 $L编译伪指令和外部子程序 51
7.4.2 PUBLIC伪指令:使Turbo Assembler信息对Turbo Pascal可利用 52
7.4.3 EXTRN伪指令:使Turbo Pascal的信息在Turbo Assembler中可用 53
7.4.4 使用段定位 56
7.4.5 死代码的消除 57
7.5 Turbo Pascal参数传递约定 57
7.5.1 值参 57
7.5.1.1 标量类型 57
7.5.1.2 实型 57
7.5.1.3 单精度、双精度、扩充的和复合的:8087类型 57
7.5.1.4 指针 58
7.5.1.5 串 58
7.5.1.6 记录和数组 58
7.5.1.7 集合 58
7.5.2 变量参数 58
7.5.3 栈的维护 58
7.5.4 存取参数 59
7.5.4.1 使用BP寄存器编址堆栈 59
7.5.4.2 使用另一个基址或变址寄存器 61
7.6 Turbo Pascal中的函数结果 61
7.6.1 标量函数结果 61
7.6.2 实型函数结果 61
7.6.3 8087函数结果 61
7.6.4 串函数结果 62
7.6.5 指针函数结果 62
7.7 为局部数据分配空间 62
7.7.1 分配私有静态存储区 62
7.7.2 分配动态存储区 62
7.8 由Turbo Pascal调用汇编语言子程序的例子 63
7.8.1 通用16进制转换子程序 64
7.8.2 交换两个变量 67
7.8.3 扫描DOS环境 70
第八章 Turbo Assembler与Turbo Basic的接口 75
8.1 传递参数 75
8.1.1 不在当前数据段的变量 77
8.1.2 什么类型的调用? 77
8.2 弹出堆栈 77
8.3 为Turbo Basic创建一个汇编程序 78
8.4 调用一个内部汇编子程序 78
8.5 在内存中安装一个Turbo Basic子程序 80
8.5.1 隐藏串 81
8.5.2 绝对调用(CALL ABSOLUTE) 82
8.5.2.1 利用绝对调用(CALL ABSOLUTE)来固定内存定位 82
8.5.2.2 绝对调用(CALL ABSOLUTE)到内存其他位置 83
8.5.2.3 CALL ABSOLUTE的其他问题 84
8.6 CALL INTERRUPT(调用中断) 84
8.7 样本程序 85
第九章 Turbo Assembler与Turbo Prolog的接口 88
9.1 声明外部谓词 88
9.2 调用约定和参数 88
9.2.1 命名约定 89
9.3 写汇编语言谓词 89
9.3.1 实现double谓词 92
9.4 用多重流模式实现谓词 94
9.5 从汇编函数调用Turbo Prolog谓词 95
9.5.1 表和函子 98
第十章 Turbo Assembler高级程序设计 101
10.1 段前缀 101
10.1.1 一种替换形式 102
10.1.2 在什么情况下段前缀并不起作用 103
10.1.3 访问多个段 104
10.2 局部标号 105
10.3 自动确定转移大小 109
10.4 超前引用代码和数据 113
10.5 使用重复块和宏 116
10.5.1 重复块 116
10.5.1.1 重复块与可变参数 119
10.5.2 宏 120
10.5.2.1 嵌套宏 124
10.5.2.2 宏与条件句 124
10.5.2.3 用EXITM终止扩展 126
10.6 良好的数据结构 128
10.6.1 STRUC伪指令 129
10.6.1.1 使用STRUC的好处与坏处 132
10.6.2 RECORD伪指令 136
10.6.2.1 访问记录 137
10.6.2.2 为什么要使用记录 140
10.6.3 UNION伪指令 142
10.7 段伪指令 145
10.7.1 SEGMENT伪指令 145
10.7.2 段排序 149
10.7.3 GROUP伪指令 150
10.7.4 ASSUME伪指令 152
10.7.5 简化的段伪指令 156
10.7.6 多段程序示例 160
第十一章 80386及其它处理器 165
11.1 用汇编语言代码切换处理器类型 165
11.2 80186和80188 166
11.2.1 启动80186汇编 166
11.2.2 新增指令 166
11.2.3 8086指令的扩展形式 170
11.3 80286 172
11.3.1 启动80286汇编 172
11.4 80386 173
11.4.1 选择80386汇编模式 173
11.4.2 新增段类型 173
11.4.3 新增寄存器 180
11.4.4 新的寻址模式 185
11.4.5 新增加的指令 189
11.5 80287 207
11.6 80387 207
第十二章 Turbo Assembler中的Ideal模式 208
12.1 什么是Ideal模式? 208
12.2 为什么要使用Ideal模式? 208
12.3 进入和退出Ideal模式 209
12.4 MASM模式和Ideal模式之间的区别 210
12.4.1 Ideal模式下的标记符 210
12.4.2 正文等价符和数字等价符(EQU和=伪指令) 211
12.4.3 表达式和操作数 212
12.4.4 算符 213
12.4.5 伪指令 216
12.4.7 定义近代码标号或远代码标号 220
12.4.8 外部符号、公共符号和全程符号 221
12.4.9 其它方面的区别 221
12.5 MASM模式和Ideal模式下程序设计的对比 222
12.5.1 对MASM模式和Ideal模式的剖析 226