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相关推荐

  1. vs2015c语言内嵌汇编,C#中内嵌资源的读取

    起因 作为一个从Cpper转到C#并且直接从事WPF开发的萌新来说,正式编码过程中碰到了不少问题,一路上磕磕碰碰的.因为软件设计需求上的要求,需要将一些配置文件(XML.INI等)内嵌到程序中,等需要 ...

  2. 嵌入式:ARM内嵌汇编及C和ARM汇编相互调用

    内嵌汇编 在C程序中嵌入汇编程序可以实现一些高级语言没有的功能,并可以提高执行效率.armcc和armcpp内嵌汇编器支持完整的ARM指令集:tcc和tcpp用于Thumb指集.但是内嵌汇编器并不支持 ...

  3. ATT汇编语言与GCC内嵌汇编简介

    AT&T汇编语言与GCC内嵌汇编简介 1 AT&T 与INTEL的汇编语言语法的区别 1.1大小写 1.2操作数赋值方向 1.3前缀 1.4间接寻址语法 1.5后缀 1.6指令 2 G ...

  4. Win64 驱动内核编程-24.64位驱动里内嵌汇编

    64位驱动里内嵌汇编 讲道理64位驱动是不能直接内链汇编的,遇到这种问题,可以考虑直接把机器码拷贝到内存里,然后直接执行. 获得机器码的方式,可以写好代码之后,直接通过vs看反汇编,然后根据地址在看内 ...

  5. Linux C: 内嵌汇编语法

    学内嵌汇编首先知道编译器的编译流程,内嵌汇编就是嵌套在高级程序语言中的汇编语言.在cpp 文件转成 .s 汇编文件时,内嵌汇编保持不动,只有高级程序语言会编译成汇编合成在.s文件中.下面的链接将了C的 ...

  6. swi 指令能用在C语言吗,内嵌汇编指令的应用举例

    下面是在C语言程序中嵌入式汇编程序的例子.通过这几个例子,可帮助用户更好地理解内嵌汇编的特点及用法. (1)  字符串复制 本例主要介绍如何使用指令BL调用子程序. 注意,在内嵌的SWI和BL指令中, ...

  7. GCC如何编译内嵌汇编代码

    内核代码绝大部分使用C  语言编写,只有一小部分使用汇编语言编写,例如与特定体系结构相关的代码和对性能影响很大的代码.GCC提供了内嵌汇编的功能,可以在C代码中直接内嵌汇编语言语句,大大方便了程序设计 ...

  8. Linux的gcc可以看汇编,linux gcc 内嵌汇编

    通常嵌入到 C 代码中的汇编语句很难做到与其它部分没有任何关系,因此更多时候需要用到完整的内联汇编格式,即汇编模板: __asm__  __volatile__ ("asm statemen ...

  9. __asm__ __volatile__ GCC的内嵌汇编语法 ATT汇编语言语法(Z)

    此文在网上到处转载,已不知原出处,我也将之记录在此,并改正其中的一些小笔误. 开 发一个OS,尽管绝大部分代码只需要用C/C++等高级语言就可以了,但至少和硬件相关部分的代码需要使用汇编语言,另外,由 ...

  10. linux c语言编程内嵌汇编,gcc编译c语言中内嵌汇编

    gcc编译c语言中内嵌汇编 --AT&T and Intel 汇编语法对照 寄存器命名: AT&T:  %eax Intel: eax AT&T 语法源地址在左侧,目的地址在右 ...

最新文章

  1. DeepLearning tutorial(2)机器学习算法在训练过程中保存参数
  2. 东莞新能源——业务流程管理实践
  3. python查看函数参数快捷键_Python基础知识—快捷键
  4. EasyNVR智能云终端硬件与EasyNVR解决方案软件综合对比
  5. python cnn程序_python cnn训练(针对Fashion MNIST数据集)
  6. fedora 19 gnome 3.8 关闭笔记本盖子的动作
  7. OpenCV 文本显示 putText 和 getTextSize
  8. 信息隐藏预测算法之MED
  9. 3dmax2014 uv用法_3dmax中UV贴图的使用方法
  10. 测试theano有无使用GPU
  11. 根据一学期的学习,谈谈你对软件工程学科的认识。
  12. 易康EPS2的使用(一)
  13. 线性代数【10】 相似矩阵
  14. 这是50年前的一本关于30年前软件开发经验的书——《人月神话》读书笔记
  15. 文本比较算法--Needleman/Wunsch算法
  16. 树莓派实验室python人脸识别_使用树莓派进行简易人脸识别
  17. simon手册翻译_part1
  18. 通俗易懂的讲解二极管三极管工作原理
  19. 揭秘VR游戏开发:与传统3D差距仅10% 低延迟是核心
  20. latex和latex数学公式

热门文章

  1. 微信读书vscode插件_想用 VSCode 写书?这款插件必须备上!
  2. 关于如何把用手机查看原型
  3. 软件工程师和程序员到底有多大的区别?
  4. Markdown编辑器语法之代码高亮、标记和文字颜色
  5. Linux重置mysql密码
  6. Windows电脑怎么卸载服务/删除服务?
  7. imewlconverter 制作Rime词库
  8. ISP模块之RAW DATA去噪(二)--BM3D算法
  9. 模拟集成电路设计(拉扎维)第四章学习笔记
  10. 深入学习软件测试:混合正交表工具