C++与汇编混合编程:INVOKE与PROTO的使用

需积分: 10 3 下载量 169 浏览量 更新于2024-08-25 收藏 337KB PPT 举报
"这篇文档主要讨论了C++与汇编语言的混合编程,特别是涉及到C++和汇编之间调用的注意事项以及相关的伪指令。它提到了如何在汇编语言中使用C++的注释,并指出在混合编程时,应当避免使用CALL指令来调用带参数的过程,而应使用INVOKE伪指令。此外,文档还详细解释了PROC和PROTO伪指令的作用,以及调用距离、语言类型、命名约定和作用范围的概念。" 在C++与汇编的混合编程中,有几点关键知识点需要掌握: 1. **操作码与操作数**:汇编语言中的操作码可以是8086/8087指令或伪指令,如db/dw/dd和extern,操作数可以是立即数、寄存器名,甚至C语言中的常量、变量和标号。同时,汇编语句可以用分号或换行符结束,且支持C语言的注释形式。 2. **调用过程的策略**:不推荐使用CALL指令来调用带参数的过程,因为它可能导致复杂性增加。推荐使用INVOKE伪指令,这要求先用PROTO伪指令声明过程的结构。 3. **PROC和PROTO伪指令**: - **PROC** 伪指令用于定义过程,包括调用距离、语言类型、作用范围以及参数信息。它可以自动创建过程的起始和结束代码,处理参数传递和堆栈清理。 - **PROTO** 伪指令则用于声明过程的调用约定,如语言类型、参数类型,它为调用者提供了关于被调用过程的信息。 4. **调用距离和语言类型**: - 调用距离决定了过程是近调用(NEAR16/32)还是远调用(FAR),在简化段格式中,调用距离默认由.model语句的存储模式决定。 - 语言类型如C、SYSCALL、 STDCALL、PASCAL、BASIC和FORTRAN,分别对应不同的命名约定和调用约定,比如C语言类型的约定是从右到左传递参数,而PASCAL是从左到右。 5. **命名约定**:不同语言类型有特定的命名规则,例如C语言会将函数名前加上下划线,PASCAL会将函数名转换为大写。 6. **参数传递顺序**:C和STDCALL约定是从右到左传递参数,而PASCAL和BASIC是从左到右。SYSCALL是系统调用约定,通常从右到左。 7. **作用范围**:PUBLIC表示过程对其他模块可见,PRIVATE表示仅在当前模块可见,EXPORT则意味着过程对外公开且在导出表中。 8. **寄存器列表**:通过“USES”列出过程中需要保存和恢复的寄存器,汇编器会自动处理这些寄存器的入栈和出栈操作。 9. **起始参数**:在PROC伪指令中,可以指定起始参数,用于自动生成处理堆栈参数和清理堆栈的代码。 理解并熟练应用这些知识点,能有效帮助开发者在C++和汇编之间进行高效的混合编程,同时确保调用约定的一致性和正确性。