C++ 调用汇编代码
使用汇编代码的时机和意义
Microsoft c++ x86 内联汇编
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| #include <iostream>
int main() { int a = 250;
__asm mov eax,a __asm add eax,1 __asm mov a,eax
std::cout << a; __asm { mov eax, a add eax, 1 mov a, eax }
std::cout << a; }
|
__asm 中汇编使用规范
_asm支持
Pentium 4 和 AMD Athlon 所有操作码
支持MMX指令集
可以利用_emit创建目标处理器支持的其他指令
如果_emit生成修改寄存器的值,编译器无法确定哪些寄存器受到影响,这个时候编译器容易做出错误的判断,程序可能产生不可预测的行为。
asm 与 段引用 __asm中必须通过寄存器来引用段 不能通过段名称来访问
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| int a[1000]; int count; int arySize; int typeAry; _asm { mov count,LENGTH a mov arySize,SIZE a mov typeAry,TYPE a }
std::cout << "元素个数为: " << count << std::endl; std::cout << "元素大小为: " << arySize << std::endl; std::cout << "元素大小为: " << typeAry << std::endl;
|
__asm的调试
/Zi 编译选项 可以使用源代码调试内联汇编程序,可以在C/C++/汇编代码上设置断点
把多条汇编语言放在同一行可能会妨碍调试
__asm中 C/C++使用规范
__asm代码优化和寄存器的注意事项
_fastcall 不建议包含_asm代码
esp、ebp跟栈有关系,不能随便改
_declspec(naked)