用VC写Assembly代码(4)

原创 2006年05月24日 20:19:00

在汇编中使用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更好).

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

Shellcode的原理及编写

1.shellcode原理
  • maotoula
  • maotoula
  • 2014年01月19日 17:11
  • 28902

8连通、4连通的洪泛填充以及边界填…

运用八连通边界填充算法进行多边形的填充 (1)首先通过颜色混合的方式形成一个图形包中函数的对多边形的填充,如下图所示: 计算机图形学  Opengl" TITLE="8连通、4连通的洪泛填充以及...
  • CHINAonlyQiu
  • CHINAonlyQiu
  • 2013年08月23日 15:07
  • 1358

使用Assembly来开发C#程序

什么是Assembly(程序集)? Assembly是一个包含程序的名称,版本号,自我描述,文件关联关系和文件位置等信息的一个集合。在.net 框架中通过Assembly类来支持,该类位于Syste...
  • cyongxue
  • cyongxue
  • 2013年05月18日 09:29
  • 1827

An error occurred during the installation of assembly 'Microsoft.VC90.CRT,version = "9.0.21022.8"

问题描述windows安装python2.7的时候出现An error occurred during the installation of assembly ‘Microsoft.VC90.CRT...
  • Moolight_shadow
  • Moolight_shadow
  • 2017年02月22日 17:04
  • 4069

Inline Assembly in GCC Vs VC++.

  • 2012年11月15日 22:24
  • 182KB
  • 下载

Assembly Language For Intel-Based Computers 4E.part6

  • 2008年11月25日 20:34
  • 6.11MB
  • 下载

KR 30, 60 HA with KR C4 Assembly Instructions

  • 2016年06月08日 15:37
  • 2.75MB
  • 下载

ASP.NET AJAX经典范例168 VC#版 (代码) Part 4

  • 2008年02月04日 03:04
  • 8.07MB
  • 下载

详解 “预处理、编译(compile)、 代码优化、 汇编(Assembly)、 链接 (link)”的具体过程

我们在用vc写好代码后,在进行编译和连接的时候,经常会遇到各种问题: 如在连接时遇到的问题:(1)error LNK2019: 无法解析的外部符号*** ,该符号在函数***中被引用    (2)er...
  • bzhxuexi
  • bzhxuexi
  • 2014年03月06日 10:11
  • 1278

如何通过ildasm/ilasm修改assembly的IL代码

这段时间为跟踪一个Bug而焦头烂额,最后发现是Framework的问题,这让人多少有些绝望。所以到微软论坛提了个帖子,希望能得到些帮助。虽然论坛智能到能够判断楼主是否是MSDN订阅用户,以便尽快解决(...
  • laohuang1122
  • laohuang1122
  • 2012年08月02日 09:32
  • 1662
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章: 用VC写Assembly代码(4)
举报原因:
原因补充:

(最多只允许输入30个字)