联合编译

联合编译

使用联合编译要保存环境

利用内联汇编程序,可以直接在 C 和 C++ 源程序中嵌入汇编语言指令,而无需执行额外的汇编和链接步骤。 内联汇编程序生成到该编译器中,不需要一个单独的汇编程序

__Asm关键字调用内联汇编程序,并且可以出现位置 C 或C++是合法的语句

由于内联汇编程序不需要单独的程序集和链接步骤,因此它比单独的汇编程序更方便。 内联程序集代码可以使用任何 C 变量或范围中的函数名,因此,将其与程序的 C 代码集成非常容易。 由于程序集代码可与 C 或 C++ 语句内联组合,因此它可以执行在 C 或 C++ 中难以完成或无法完成的任务。

内联程序集的用法包括:

使用汇编语言编写函数。

代码的点优化速度临界区。

通过硬件直接访问设备驱动程序。

“naked”调用编写 prolog 和 epilog 代码。

 

Microsoft 专用

__asm 关键字用于调用内联汇编程序,并且可在 C 或 C++ 语句合法时出现。 它不能单独出现。 它必须后跟一个程序集指令、一组括在大括号中的指令或者至少一对空大括号。 此处的术语“__asm 块”指任何指令或指令组(无论是否在大括号中)

asm 块:
    __asm assembly-instruction ;opt
    __asm { assembly-instruction-list } ;opt

如果不与大括号一起使用,则 __asm 关键字表示此行的其余部分是一条汇编语言语句。 如果与大括号一起使用,则该关键字表示大括号之间的每一行都是一条汇编语言语句。

 

__asm 块可以引用 C 或 C++ 数据类型和对象,但它不能定义具有 MASM 指令或运算符的数据对象。 具体而言,不能使用定义指令DB DW DD DQ DT,并且DF,或运算符DUP MASM 结构和记录也不可用。 内联汇编程序不接受指令STRUC RECORD宽度,或掩码

 

内联汇编程序不支持大多数 MASM 指令,但它确实支持EVEN对齐 这些指令放NOP (无操作),以将标签与特定边界对齐的程序集代码中的说明

 

LENGTH 长度运算符可返回数组中的元素数。 它为非数组变量返回值 1。sizeof(arr)/sizeof(arr[0])

SIZE  大小运算符可返回 C 的大小或C++变量。 变量的大小是数组的乘积及其长度类型sizeof(arr

类型运算符可返回 C 的大小或C++类型或变量。 如果变量是一个数组类型返回的单个元素数组的大小sizeof(arr[0]

_Emit pseudoinstruction 定义中当前文本段落的当前位置处的一个字节

相当于 db   只能定义一个字节

汇编标签与普通的 C 或 C++ 标签一样可以跨--asm使用

Leave可以直接平栈  然后ret

__declspec(naked)  void fun()  裸函数 没有其他入栈压栈的操作

自动抬栈宏 __LOCAL__SIZE

 

其他编译器使用联合  

__asm__(“mov eax, eax \n mov ebx,ebx\n”)

 

posted @ 2020-09-05 16:59  特权E5  阅读(427)  评论(0编辑  收藏  举报