在汇编中使用printf没什么意义,这里只说明一写问题,printf 再 __asm中的使用有点复杂.先看看下面代码:

void main()
{
 int t = 10;
 char *szformat = "t = %d/n";
 printf(szformat, t);
}

===
输出

t = 10
Press any key to continue

调试得到的汇编代码:

19:   void main()
20:   {
0040B770   push        ebp
0040B771   mov         ebp,esp
0040B773   sub         esp,48h
0040B776   push        ebx
0040B777   push        esi
0040B778   push        edi
0040B779   lea         edi,[ebp-48h]
0040B77C   mov         ecx,12h
0040B781   mov         eax,0CCCCCCCCh
0040B786   rep stos    dword ptr [edi]
21:       int t = 10;
0040B788   mov         dword ptr [ebp-4],0Ah
22:       char *szformat = "t = %d/n";
0040B78F   mov         dword ptr [ebp-8],offset string "%d/n" (0041ff6c)
23:       printf(szformat, t);
0040B796   mov         eax,dword ptr [ebp-4]
0040B799   push        eax
0040B79A   mov         ecx,dword ptr [ebp-8]
0040B79D   push        ecx
0040B79E   call        printf (0040b6f0)
0040B7A3   add         esp,8
24:   }

如果我们用感觉上的方法写个__asm 代码,会写成这样(我一开始是写成这样的):

#include <stdio.h>

void asm()
{
 int t = 10;
 char *szformat = "t = %d/n";
 __asm
 {
  push t
  lea eax, szformat
  push eax
  call printf
  add esp, 8
 }
}

void main()
{
 asm();
}

===
输出

lAPress any key to continue

哦,不!怎么和我们要的完全不一样呢?
怎么办,先看看他的汇编代码:

3:    void asm()
4:    {
0040B770   push        ebp
0040B771   mov         ebp,esp
0040B773   sub         esp,48h
0040B776   push        ebx
0040B777   push        esi
0040B778   push        edi
0040B779   lea         edi,[ebp-48h]
0040B77C   mov         ecx,12h
0040B781   mov         eax,0CCCCCCCCh
0040B786   rep stos    dword ptr [edi]
5:        int t = 10;
0040B788   mov         dword ptr [ebp-4],0Ah
6:        char *szformat = "t = %d/n";
0040B78F   mov         dword ptr [ebp-8],offset string "%d/n" (0041ff6c)
7:        __asm
8:        {
9:            push t
0040B796   push        dword ptr [ebp-4]
10:           lea eax, szformat
0040B799   lea         eax,[ebp-8]
11:           push eax
0040B79F   push        eax
12:           call printf
0040B7A0   call        printf (0040b6f0)
13:           add esp, 8
0040B7A5   add         esp,8
14:       }
15:   }

代码区别很明显,很快我得出一下代码:

#include <stdio.h>

void asm()
{
 int t = 10;
 char *szformat = "t = %d/n";
 __asm
 {
  mov eax, t
  push eax
  mov ecx, dword ptr [ebp-8]
  push ecx
  call printf
  add esp, 8
 }
}

void main()
{
 asm();
}

===
输出

t = 10
Press any key to continue

哦!不说了,有什么不清楚,上BAIDU找找吧(虽然GOOGLE更好).

有人愿意说明一下原因吗?谢谢.

用VC写Assembly代码(4)相关推荐

  1. 用VC写Assembly代码

    各位好,最近我在研究SHELLCODE 的编写,因为需要ASM的基础,所以用VC写一些ASM代码.有兴趣的朋友可以一起讨论.我们都欢迎你.  用VC写Assembly代码(1)  用VC写Assemb ...

  2. 用VC写Assembly代码(1)

    VC完全可以支持所有.486指令.我们的方法是使用__asm关键字插入Assembly代码. Assembly可以完成N多C&C++不能完成的任务.这个谁动知道.所以我们到C&C++, ...

  3. 用VC写Assembly代码(5) --函数调用(三)

    没什么好说的啦,看代码就是啦 #include <windows.h> void main() {  char *a = (char*)MessageBox;  __asm  {   pu ...

  4. 用VC写Assembly代码(6)--附录2[windows进程中的内存结构]

    在阅读本文之前,如果你连堆栈是什么多不知道的话,请先阅读文章后面的基础知识. 接触过编程的人都知道,高级语言都能通过变量名来访问内存中的数据.那么这些变量在内存中是如何存放的呢?程序又是如何使用这些变 ...

  5. 用VC写Assembly代码(6)--附录1[堆和栈的区别]

    堆和栈的区别 一.预备知识-程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)- 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数 ...

  6. 用VC写Assembly代码(2)

    虽然没人看,但我决定还是写多篇啦. 至于Assembly指令的功能,我会在适当的位置说名,如果不懂汇编的朋友,我们也可以通过没个例子和说名,慢慢也了解汇编. 来看看这个: #include <s ...

  7. 用VC写Assembly代码(7)--在Visual C++中使用内联汇编

    在Visual C++中使用内联汇编 一. 优点 使用内联汇编可以在 C/C++ 代码中嵌入汇编语言指令,而且不需要额外的汇编和连接步骤.在 Visual C++ 中,内联汇编是内置的编译器,因此不需 ...

  8. 用VC写Assembly代码(5) --一些宏的使用(二)

    目前我知道vc++ inline assembler 有这几个宏 LENGTH.SIZE.TYPE,他们使用简单,下面个个例子: void main() {  int k[10];  int a,b, ...

  9. 用VC写Assembly代码(5) --函数调用(一)

    用C写一个加载msvcrt.dll的方法如下: #include <windows.h> #include <stdio.h> void main() {   char *ms ...

  10. 用VC写Assembly代码(5) --字符串

    是有几个朋友也喜欢这种编城方法的,前几天听我一个朋友说:"真正的高手是懂C,而不是C++",想想也是. 几乎所有代码最后还是有汇编代码组成的,只是效率的问题,汇编和机器语言11对应 ...

最新文章

  1. ubuntu安装环境软件全文档
  2. 追MM与设计模式的有趣见解
  3. AWS 推出长期支持的 OpenJDK 免费分发版本 —— Amazon Corretto
  4. Unity子线程编程无法报错
  5. 触发器和存储过程的使用
  6. 创建 VSTO 工作簿的windows安装包
  7. 天然气流量计选型指南
  8. 《生死疲劳》读书有感
  9. “带花树开花”算法来解非二分图的最大匹配
  10. 同一网段分化vlan问题
  11. python键盘键值表_Python怎么记录键盘鼠标敲击次数|Python统计鼠标点击次数 - PS下...
  12. 每日算法-数字转换为十六进制
  13. 【蓝桥杯单片机进阶强化-06】超声波测距的基本原理与实现
  14. Magic Mouse鼠标滚动速度调整
  15. 关于duilib CComboUI控件下拉框 字体显示 与xml 设置不相符的问题
  16. 【智能制造】工业中的知识和智慧
  17. U盘文件夹全变为.exe格式或U盘文件全部消失(U盘AutoRun病毒解决方法)
  18. 中国首个电子商务百强榜名单-2010-09
  19. IDEA写API文档的两种方法
  20. LaTeX使用入门_Win10_TeXstudio

热门文章

  1. Elasticsearch索引的数据存储路径是如何确定的
  2. 2021中国实体零售数字化专题报告——便利店篇
  3. 2020年中国职业教育行业白皮书
  4. 工业互联网解决方案创新应用报告(2020)
  5. 2020年中国在线少儿英语培训市场研究报告
  6. python链接mysql系统结构设计_第11章:使用Python打造MySQL专家系统
  7. 朱兴杰(1986-),男,泰康保险集团股份有限公司数据信息中心应用创新高级工程师...
  8. 作者:张金芳(1970-),男,中国科学院软件研究所副研究员
  9. 使用 Warshall(沃舍尔)算法求解关系的传递闭包
  10. win10系统同时安装python2和python3