目录

内联汇编与混合汇编的原理
-
内联汇编:在C++中嵌入汇编代码,直接操作硬件资源,如寄存器和内存。
- 示例:x86内联汇编.cpp中使用_asm块插入x86指令。
-
混合汇编:C++与独立.asm文件结合,通过extern "C"调用汇编函数。
- 示例:x64.cpp调用myasm.asm中的myadd函数,实现64位加法。
底层原理:
-
内联汇编:编译器(如Visual Studio)解析_asm块,将汇编指令直接转换为机器码,与C++代码整合。开发者手动管理寄存器和堆栈。
-
混合汇编:汇编代码编译为.obj文件,链接器合并C++和汇编符号。调用约定定义参数传递规则。
-
底层交互:通过寄存器(eax/rax)和堆栈传递数据。x86使用32位寄存器,x64使用64位并遵循Microsoft x64约定。
-
编译流程:预处理头文件,编译生成.obj,链接整合符号,生成可执行文件。
-
执行步骤:CPU取指、解码、执行、写回结果,推进程序计数器。
x86与x64架构差异
x86:32位寄存器(如eax、ebx),栈帧由esp和ebp管理,调用约定如__stdcall或__cdecl(参数压栈)。
x64:64位寄存器(如rax、rcx),新增r8/r9,栈帧依赖rsp;Microsoft x64约定前4参数通过rcx/rdx/r8/r9,其余压栈,调用者清理;栈16字节对齐(x86为4字节)。
底层原理:
-
寄存器扩展:x64将x86寄存器扩展为64位,提高数据处理效率。
-
调用约定优化:x64优先寄存器传参,减少内存访问,提升性能。
-
内存对齐:确保数据访问效率,避免对齐惩罚。
-
架构演进:x64兼容x86,但引入新指令集和ABI(应用二进制接口)。
-
兼容步骤:编译器根据目标架构生成代码,链接时检查约定一致性。
X86内联汇编
#include <iostream>
#include<windows.h>
// 实现两个整数加法
int myadd(int a, int b) {
return a + b;
}
int main() {
int nNum = 0;
_asm {
xor eax,eax
mov eax,10
add eax,nNum
mov nNum,eax
push 1
push 2
call myadd
add esp,8
}
system("pause");
return 0;
}

X64混合编程

-
直接调用这个asm文件就可以了链接器会带我们找到的
/*
1 函数声明 myadd
2 声明外部汇编函数 计算两个64位整数和
3 通过extren c链接汇编实现myadd
4 C++ 与汇编通过链接器整合,遵循 Microsoft x64 调用约定
5
*/
extern "C" long long myadd(long long llNumberA, long long llNumberB);int main()
{
long long llRes = myadd(1, 2);
std::cout << llRes << std::endl;system("pause"); return 0;}
asm文件
.code
myadd proc
sub rsp,28h
xor rax,rax
add rax,rcx
add rax,rdx
add rsp,28h
ret
myadd endp
end