高级语言调用汇编语言的接口规范
从高级语言中调用汇编过程时,需要解决一些常见的问题。
首先,一种语言使用的命名规范(naming convention)是指与变量和过程命名相关的规则和特性。比如,一个需要回答的重要问题是:汇编器或编译器会修改目标文件中的标识符名称吗?如果是,如何修改?
其次,段名称必须与高级语言使用的名称兼容。
第三,程序使用的内存模式(微模式、小描述、紧凑模式、中模式、大模式、巨模式,或平坦模式)决定了段大小(16 或 32 位),以及调用或引用是近(同一段内)还是远(不同段之间)。
例如,假设 C 程序 Main.c 调用外部过程 ArraySum。如下图所示,C 编译器自动保留大小写,并为外部名称添加前导下划线,将其修改为 _ArraySum:
Array.asm 模块用汇编语言编写,由于其 .MODEL 伪指令使用的选项为 Pascal 语言,因此输出 ArraySum 过程的名称就是 ARRAYSUM。由于两个输出的名称不同,因此链接器无法生成可执行程序。
早期编程语言,如 COBOL 和 PASCAL,其编译器一般将标识符全部转换为大写字母。近期的语言,如 C、C++ 和 Java 则保留了标识符的大小写。
此外,支持函数重载的语言(如 C++)还使用名称修饰 (name decoration) 的技术为函数名添加更多字符。比如,若函数名为 MySub (int n, double b),则其输出可能为 MySub#int#double。
在汇编语言模块中,通过 .MODEL 伪指令选择语言说明符来控制大小写。
首先,一种语言使用的命名规范(naming convention)是指与变量和过程命名相关的规则和特性。比如,一个需要回答的重要问题是:汇编器或编译器会修改目标文件中的标识符名称吗?如果是,如何修改?
其次,段名称必须与高级语言使用的名称兼容。
第三,程序使用的内存模式(微模式、小描述、紧凑模式、中模式、大模式、巨模式,或平坦模式)决定了段大小(16 或 32 位),以及调用或引用是近(同一段内)还是远(不同段之间)。
调用规范
调用规范(calling convention)是指调用过程的底层细节。下面列出了需要考虑的细节信息:- 调用过程需要保存哪些寄存器
- 传递参数的方法:用寄存器、用堆栈、共享内存,或者其他方法
- 主调程序调用过程时,参数传递的顺序
- 参数传递方法是传值还是传引用
- 过程调用后,如何恢复堆栈指针
- 函数如何向主调程序返回结果
命名规范与外部标识符
当从其他语言程序中调用汇编过程时,外部标识符必须与命名规范(命名规则)兼容。外部标识符(external identifier)是放在模块目标文件中的名称,链接器使得这些名称能够被其他程序模块使用。链接器解析对外部标识符的引用,但是仅适用于命名规范一致的情况。例如,假设 C 程序 Main.c 调用外部过程 ArraySum。如下图所示,C 编译器自动保留大小写,并为外部名称添加前导下划线,将其修改为 _ArraySum:
Array.asm 模块用汇编语言编写,由于其 .MODEL 伪指令使用的选项为 Pascal 语言,因此输出 ArraySum 过程的名称就是 ARRAYSUM。由于两个输出的名称不同,因此链接器无法生成可执行程序。
早期编程语言,如 COBOL 和 PASCAL,其编译器一般将标识符全部转换为大写字母。近期的语言,如 C、C++ 和 Java 则保留了标识符的大小写。
此外,支持函数重载的语言(如 C++)还使用名称修饰 (name decoration) 的技术为函数名添加更多字符。比如,若函数名为 MySub (int n, double b),则其输出可能为 MySub#int#double。
在汇编语言模块中,通过 .MODEL 伪指令选择语言说明符来控制大小写。
段名称
汇编语言过程与高级语言程序链接时,段名称必须是兼容的。本章使用 Microsoft 简化段伪指令 .CODE、.STACK 和 .DATA,它们与 Microsoft C++ 编译器生成的段名称兼容。内存模式
主调程序与被调过程使用的内存模式必须相同。比如,实地址模式下可选择小模式、中模式、紧凑模式、大模式和巨模式。保护模式下必须使用平坦模式。所有教程
- socket
- Python基础教程
- C#教程
- MySQL函数
- MySQL
- C语言入门
- C语言专题
- C语言编译器
- C语言编程实例
- GCC编译器
- 数据结构
- C语言项目案例
- C++教程
- OpenCV
- Qt教程
- Unity 3D教程
- UE4
- STL
- Redis
- Android教程
- JavaScript
- PHP
- Mybatis
- Spring Cloud
- Maven
- vi命令
- Spring Boot
- Spring MVC
- Hibernate
- Linux
- Linux命令
- Shell脚本
- Java教程
- 设计模式
- Spring
- Servlet
- Struts2
- Java Swing
- JSP教程
- CSS教程
- TensorFlow
- 区块链
- Go语言教程
- Docker
- 编程笔记
- 资源下载
- 关于我们
- 汇编语言
- 大数据
- 云计算
- VIP视频