在C/C++直接插入汇编代码的方法-内联汇编
创始人
2024-03-30 17:02:15
0

🍃博主昵称:一拳必胜客
博主主页面链接:博主主页传送门
博主专栏页面连接:专栏传送门–计算机考研
🍑创作初心:本博客的初心是每天分享记录自己学习的脚步,和各位技术友探讨交流,同时给同样感兴趣的朋友以参考;
博主研究方向:渗透测试、嵌入式、机器学习;
🌸博主寄语:感谢各位技术友的支持,您的支持就是我前进的动力 ;
‘’
 特别鸣谢:木芯工作室
特别鸣谢:木芯工作室 、Ivan from Russia


文章目录

  • 🍃方法总结
    • 案例1
    • 案例2-内联汇编
    • 内联汇编A+B
    • 基础讲解


🍃方法总结

在c语言直接插入汇编

C/C++中内嵌汇编(Visual Studio 2019)

案例1

#include int main()
{int a = 0, b = 0, c = 0;__asm{/*push eax s*/mov a, 1000mov b, 200mov c, 1/*mov eax, aadd eax, bsub eax, cmov a, eax *//*pop eax*/}/*__asm mov a,1000*/printf("a=%d\nb=%d\nc=%d\n", a, b, c);return 0;
}

案例2-内联汇编

  1. 内联汇编示例:
    Hello, World为例:
#include
#includeconst char *s1="Hello, World\n",*s2="pause";
int main(){printf(s1);system(s2);return 0;
}

内联汇编版本:

#include 
#includeconst char* s1 = "Hello, World\n", * s2 = "pause";
int main() {__asm {mov eax, dword ptr[s1]push eaxcall dword ptr[printf]add esp, 4mov eax, dword ptr[s2]push eaxcall dword ptr[system]add esp, 4}return 0;
}

内联汇编A+B

这里是引用
在这里插入图片描述

#include 
#includeconst char *s1="%d%d",*s2="%d\n",*s3="pause";
int a,b;
int main(){__asm{lea eax,[b]push eaxlea eax,[a]push eaxmov eax,dword ptr [s1]push eaxcall dword ptr [scanf]add esp,12mov eax,[a]add eax,[b]push eaxmov eax,dword ptr [s2]push eaxcall dword ptr [printf]add esp,8mov eax,dword ptr [s3]push eaxcall dword ptr [system]add esp,4}return 0;
}

基础讲解

因为在Visual C++中使用内联汇编不需要额外的编译器和联接器,且可以处理Visual
C++中不能处理的一些事情,同时可以使用在C/C++中的变量,所以非常方便。

内联汇编代码不易于移植,如果你的程序打算在不同类型的机器(比如x86和Alpha)上运行,应当尽量避免使用内联汇编,这时可以使用MASM,因为MASM支持更方便的宏指令和数据指示符。

  1. __asm语法

__asm关键字用来调用内联汇编,可以出现在任何合法的C或C++声明中。它不能单独出现,后面必须有汇编指令,可以是一条汇编指令、大括号括起来的一组代码,或者至少是大括号括起来的空代码。术语“__asm块”指的是任何单独的一条指令或一组指令,可以不包括在大括号里。

第一种语法格式:

__asm 汇编指令

第二种语法格式:

__asm { 汇编指令列表 }

例如,下面的代码是一个简单的大括号里的__asm块:

__asm {   mov al, 4   mov dx, 0xB008   out dx, al }

另外,在每一条汇编指令前加上__asm,与前面的方法是一样的作用。例如:

__asm mov al, 4
__asm mov dx, 0xB0008
__asm out dx, al

上面的两个例子所生成的代码是相同的,但是在括号里的__asm块这种方式更具优势,因为大括号可以使汇编指令很清楚地和C或C++代码分开,避免了无意义的__asm关键字重复。另外,大括号还可以避免引起歧义。如果想把C或C++代码和__asm块放在同一行,则必须把这个__asm块放在括号里。如果没有括号,编译器就不能确定汇编代码结束和C或C++代码起始的位置。

另外,由于大括号里的语句和一般的MASM语句格式一样,所以可以很方便地从现有的MASM源程序里复制。

不像C或C++中的"{}",__asm块中的"{}"不会影响C或C++变量的作用范围。同时,__asm块可以嵌套,嵌套也不会影响变量的作用范围。

转载于:https://www.cnblogs.com/smart-zihan/p/11315436.html

相关内容

热门资讯

兰石重装(603169)披露制... 截至2025年12月29日收盘,兰石重装(603169)报收于10.59元,较前一交易日下跌0.28...
教育部明确学前儿童建学籍,多地... “凡在依法举办的幼儿园就读的学前儿童均须建立学籍,一人一号,小学学段接续使用,终身不变,学籍变动管理...
北京市房屋建筑使用安全条例 北京市人民代表大会常务委员会公告 〔十六届〕第46号 《北京市房屋建筑使用安全条例》已由北京市第十六...
吉比特(603444)披露制定... 截至2025年12月29日收盘,吉比特(603444)报收于423.52元,较前一交易日下跌2.3%...
《北京市房屋建筑使用安全条例》... 《北京市房屋建筑使用安全条例》(以下简称《条例》)已由北京市第十六届人民代表大会常务委员会第二十次会...
股市必读:ST葫芦娃因涉嫌违反... 截至2025年12月29日收盘,ST葫芦娃(605199)报收于8.41元,下跌4.97%,换手率0...
公告精选 | 赣锋锂业涉嫌内幕... 风险提示 天箭科技(002977.SZ):公司相关军品2025年度进行了价格审核,与客户签订了《军品...
如何避免夫妻共同债务纠纷 有纠... 夫妻共同债务纠纷是婚姻破裂时的高发矛盾,会涉及日常借贷、经营投资等多重场景。那如何避免夫妻共同债务纠...
旋极信息:将持续关注海南自贸区... 有投资者在互动平台向旋极信息提问:“请问在海自贸区有那些业务布局?” 针对上述提问,旋极信息回应称:...
财经不烧脑 | 信用修复政策来... 你是不是也有这样的烦恼?就一次忘了还钱,金额可能也不大,结果征信报告上“挂”了整整五年!房贷、车贷、...