企业即时通讯 - Enterprise Instant Messenger

局域网聊天工具,文字讯息、文件发送、语音通讯、高清视频通讯、远程桌面控制。

用户操作
[即时聊天] [发私信] [加为好友]
FreeEIM StudioID:i_like_cpp
972423次访问,排名32,好友4人,关注者7人。
i_like_cpp的文章
原创 888 篇
翻译 4 篇
转载 69 篇
评论 1148 篇
FreeEIM Studio的公告
最近评论
ScanerKi:#include <stdio.h>

int asm(int s)
{
int t=0;
__asm
{
mov eax, DWORD PTR [ebp+8] ;把s的值传给eax
mov t, eax ;把eax的值传给t
}
printf("- %d……
li_delong:谢谢
li_delong:谢谢
li_delong:谢谢
XUETUJIAN:
文章分类
收藏
相册
EIM 截图
相关软件图片
PI的最精确值
FreeEIM 标签
FreeEIM华军下载
XP SP2 SDK
下载FreeEIM
盛天龙
飞鸽传书
不错的网站
CPPBLOG
局域网聊天
泡妞专家
用VC写Assembly代码(RSS)
百度的Blog(RSS)
存档
软件项目交易
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
订阅到BlogLines
订阅到Yahoo
订阅到GouGou
订阅到飞鸽
订阅到Rojo
订阅到newsgator
订阅到netvibes

原创  用VC写Assembly代码(4)收藏

新一篇: 10 Ways to Make Your Code More Testable | 旧一篇: 用VC写Assembly代码(3)

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

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

发表于 @ 2006年05月24日 20:19:00|评论(loading...)|编辑

新一篇: 10 Ways to Make Your Code More Testable | 旧一篇: 用VC写Assembly代码(3)

评论

#a 发表于2006-05-25 19:31:00  IP: 218.18.213.*
背景(50%)+技术(5%)+送礼(25%)+人情(20%)=成功(100%),金子不一定都能发光!
#ppwd 发表于2006-05-27 13:23:00  IP: 61.52.43.*
其实改成下面这段代码就可以了,上面出错的原因是你传给printf的参数不对,你上面的调用就相当于
printf(&szformat, t)
当然就不对了
如果改成
printf(szformat, t)
就可以了
修改后的代码如下,作者可以测试一下:
另外,还有一个问题
asm是系统关键字,当作函数名在VC6.0中编译会出问题,我不知道作者用的是什么编译器。
如果作者认为我所说的有问题的话,可以直接跟我联系,
MSN:ppwd25@hotmail.com
欢迎交流


#include <stdio.h>

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

void main()
{
testasm();
}
#ppwd 发表于2006-05-27 13:29:00  IP: 61.52.43.*
背景(50%)+技术(5%)+送礼(25%)+人情(20%)=成功(100%)
虽然现在的社会是这样一种社会,我们无法改变这种大环境,那就只有不断的去适应这种社会,才可以在这个社会上生存,如果你不能够适应社会,那说明你还不是一块金子。现在这个社会,技术不是单纯的技术,而是一种多元化的技术,我相信,是金子总会发光的,只要金子在不断的努力着想让自己发光,而不是被别的金子的光芒所掩盖了。不好意思,我的意思不是要批评你什么,我也没有那个资格,我只是发表一下我的看法而已,如果有什么说的不妥的地方,还请原谅。
#iEpsilonMeteOra 发表于2006-06-01 14:54:00  IP: 222.66.73.*
背景(50%)+技术(5%)+送礼(25%)+人情(20%)=成功(100%)
??!!
哼!这就是没本事没技术的人的生活准则。
发表评论  


登录
Csdn Blog version 3.1a
Copyright © FreeEIM Studio