C++内嵌汇编 教程1
Python微信订餐小程序课程视频
https://edu.csdn.net/course/detail/36074
Python实战量化交易理财系统
https://edu.csdn.net/course/detail/35475
注:本文的所有代码是在我自己的VS2008中测试的,由于环境的差别,不能保证能在所有的编译器上运行。
1.内嵌汇编介绍
在C++中,可以通过__asm关键字来嵌入汇编语言。例如
int main(){\_\_asm{//汇编!mov eax,0}return 0;
}
2.汇编版本Hello, World!
我们知道,在C++中,可以使用printf函数来输出。(如果使用cout,需要使用运算符重载等技术,在这里反而不方便)
提示:汇编中,调用函数的指令叫做CALL。函数的参数是保存在栈中的。
那么我们可以开始写了。首先,先看看C++正常版本的:
#include
#includeconst char *s1="Hello, World\n",*s2="pause";
int main(){printf(s1);system(s2);return 0;
}
为了方便,我们先把正常版本反汇编一下,结果是:
printf(s1);
00BD13CE mov esi,esp
00BD13D0 mov eax,dword ptr [s1 (0BD7038h)]
00BD13D5 push eax
00BD13D6 call dword ptr [\_\_imp\_\_printf (0BD82C4h)]
00BD13DC add esp,4
00BD13DF cmp esi,esp
00BD13E1 call @ILT+315(\_\_RTC\_CheckEsp) (0BD1140h)
第一句,mov esi,esp 为了后面检查栈是否正常用第二句,mov eax,dword ptr[s1] 括号中的0BD7038h是地址,不要管他,意思是把地址放到eax中去第三句,push eax 把刚才放进eax的地址放入栈, 实际就是把参数放入栈
第四句,call dword ptr [__imp__printf]__imp__printf是printf函数编译后的结果,下划线开头表示这是一个函数我们平时写内联汇编的时候直接写printf即可
第五句,add esp,4其实是手动平栈,之前往栈里面放了4字节的s1,现在把esp指针也就是栈顶指针下移(栈从高地址往低地址),平栈
最后两句不管它,就是保证esi和esp相等,因为之前手动平了栈,结合第一句,这里应该是相等的,不写应该也没事
最终的内联汇编应该是这样:
#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;
}
运行结果正常。
3.内联汇编A+B
A+B问题,同时需要使用scanf和printf
首先注意一点,函数的参数在栈中是倒着存放的。(注:这个C标准没有规定,但是汇编语言本身就是非常依赖环境的一个东西,所以暂且不管它)
例如
scanf("%d %d",&a,&b);
如果翻译成汇编,应该是这样(下面的是伪代码)
push &b
push &a
push "%d %d"
call scanf
然后我们就可以开始写了。
scanf的部分,注意最前面两个参数,由于放入的是地址,所以不能使用MOV指令而是要使用LEA指令
lea eax,[a]
表示把a的地址放入eax中。
其他部分没有什么难度,注意最后平栈的时候,add esp到底加上多少,加上的是每个参数的大小相加。
例如scanf,每个都是4字节的地址,总共就是12字节。
完整代码
#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;
}
C++内嵌汇编 教程1相关推荐
- vs2015c语言内嵌汇编,C#中内嵌资源的读取
起因 作为一个从Cpper转到C#并且直接从事WPF开发的萌新来说,正式编码过程中碰到了不少问题,一路上磕磕碰碰的.因为软件设计需求上的要求,需要将一些配置文件(XML.INI等)内嵌到程序中,等需要 ...
- 嵌入式:ARM内嵌汇编及C和ARM汇编相互调用
内嵌汇编 在C程序中嵌入汇编程序可以实现一些高级语言没有的功能,并可以提高执行效率.armcc和armcpp内嵌汇编器支持完整的ARM指令集:tcc和tcpp用于Thumb指集.但是内嵌汇编器并不支持 ...
- ATT汇编语言与GCC内嵌汇编简介
AT&T汇编语言与GCC内嵌汇编简介 1 AT&T 与INTEL的汇编语言语法的区别 1.1大小写 1.2操作数赋值方向 1.3前缀 1.4间接寻址语法 1.5后缀 1.6指令 2 G ...
- Win64 驱动内核编程-24.64位驱动里内嵌汇编
64位驱动里内嵌汇编 讲道理64位驱动是不能直接内链汇编的,遇到这种问题,可以考虑直接把机器码拷贝到内存里,然后直接执行. 获得机器码的方式,可以写好代码之后,直接通过vs看反汇编,然后根据地址在看内 ...
- Linux C: 内嵌汇编语法
学内嵌汇编首先知道编译器的编译流程,内嵌汇编就是嵌套在高级程序语言中的汇编语言.在cpp 文件转成 .s 汇编文件时,内嵌汇编保持不动,只有高级程序语言会编译成汇编合成在.s文件中.下面的链接将了C的 ...
- swi 指令能用在C语言吗,内嵌汇编指令的应用举例
下面是在C语言程序中嵌入式汇编程序的例子.通过这几个例子,可帮助用户更好地理解内嵌汇编的特点及用法. (1) 字符串复制 本例主要介绍如何使用指令BL调用子程序. 注意,在内嵌的SWI和BL指令中, ...
- GCC如何编译内嵌汇编代码
内核代码绝大部分使用C 语言编写,只有一小部分使用汇编语言编写,例如与特定体系结构相关的代码和对性能影响很大的代码.GCC提供了内嵌汇编的功能,可以在C代码中直接内嵌汇编语言语句,大大方便了程序设计 ...
- Linux的gcc可以看汇编,linux gcc 内嵌汇编
通常嵌入到 C 代码中的汇编语句很难做到与其它部分没有任何关系,因此更多时候需要用到完整的内联汇编格式,即汇编模板: __asm__ __volatile__ ("asm statemen ...
- __asm__ __volatile__ GCC的内嵌汇编语法 ATT汇编语言语法(Z)
此文在网上到处转载,已不知原出处,我也将之记录在此,并改正其中的一些小笔误. 开 发一个OS,尽管绝大部分代码只需要用C/C++等高级语言就可以了,但至少和硬件相关部分的代码需要使用汇编语言,另外,由 ...
- linux c语言编程内嵌汇编,gcc编译c语言中内嵌汇编
gcc编译c语言中内嵌汇编 --AT&T and Intel 汇编语法对照 寄存器命名: AT&T: %eax Intel: eax AT&T 语法源地址在左侧,目的地址在右 ...
最新文章
- DeepLearning tutorial(2)机器学习算法在训练过程中保存参数
- 东莞新能源——业务流程管理实践
- python查看函数参数快捷键_Python基础知识—快捷键
- EasyNVR智能云终端硬件与EasyNVR解决方案软件综合对比
- python cnn程序_python cnn训练(针对Fashion MNIST数据集)
- fedora 19 gnome 3.8 关闭笔记本盖子的动作
- OpenCV 文本显示 putText 和 getTextSize
- 信息隐藏预测算法之MED
- 3dmax2014 uv用法_3dmax中UV贴图的使用方法
- 测试theano有无使用GPU
- 根据一学期的学习,谈谈你对软件工程学科的认识。
- 易康EPS2的使用(一)
- 线性代数【10】 相似矩阵
- 这是50年前的一本关于30年前软件开发经验的书——《人月神话》读书笔记
- 文本比较算法--Needleman/Wunsch算法
- 树莓派实验室python人脸识别_使用树莓派进行简易人脸识别
- simon手册翻译_part1
- 通俗易懂的讲解二极管三极管工作原理
- 揭秘VR游戏开发:与传统3D差距仅10% 低延迟是核心
- latex和latex数学公式